面试:hive的优化, 4个by, 存储过程和自定义函数

hive的优化

  1. 分区分桶>>分区提高查询速度; 分桶提高表连接速度

  2. orc存储格式>>压缩数据可以减少存储空间,提高数据的读取速度

参数配置的优化:

3. sql的优化

避免大数据量的临时表

使用EXPLAIN命令查看查询的执行计划,分析可能的性能瓶颈

确保JOIN操作有合适的连接条件,避免产生笛卡尔积

优化排序和聚合操作:使用SORT BYDISTRIBUTE BY来优化排序和聚合操作,减少数据的移动

hive的4个by

ORDER BY: 全局排序,即对查询结果的所有数据进行排序。它会将所有数据传送到单个Reducer进行排序,因此在数据量较大时可能会导致性能瓶颈。 它通常在SELECT语句的结尾使用,可以指定升序(ASC)或降序(DESC)。

SORT BY: 用于局部排序,即对每个Reducer的输出进行排序,但不会保证全局有序。它通常用于需要对大数据集进行排序且对全局有序性要求不高的场景。 SORT BY可以与DISTRIBUTE BY一起使用,以控制数据的分布和局部排序。

DISTRIBUTE BY: 用于控制数据在Map阶段后的分布,即如何将数据分配到不同的Reducer中。这个关键字决定了数据的物理分布,可以减少数据的shuffle(重新分布)操作,从而提高查询性能。

CLUSTER BY: 当DISTRIBUTE BY和SORT BY字段相同时,可以使用CLUSTER BY方式。CLUSTER BY除了具有**DISTRIBUTE BY的功能外还兼具SORT BY的功能,**但是排序只能是升序排序, CLUSTER BY通常用于当需要同时进行数据分布和局部排序时。

存储过程和自定义函数的区别

一、功能定位

  1. 存储过程

    • 存储过程主要用于封装一系列复杂的数据库操作,通常涉及多个表的查询、更新、插入或删除等操作。它可以包含控制流语句(如条件判断、循环等),以实现较为复杂的业务逻辑。

    • 例如,在信贷项目中,存储过程可以用于执行信贷审批流程。它可以查询客户的信用记录、资产信息等多个表,根据特定的规则进行判断,决定是否批准贷款,并更新相关表中的贷款状态。

  2. 自定义函数

    • 自定义函数通常专注于执行特定的计算或操作,并返回一个结果值。它的功能相对较为单一,主要用于数据的转换、计算或特定的业务逻辑处理。

    • 比如,在信贷项目中,可以创建一个自定义函数来计算客户的信用评分。这个函数接受客户的相关信息作为参数,根据特定的算法进行计算,并返回信用评分值。

二、返回值类型

  1. 存储过程

    • 存储过程可以返回结果集、输出参数或状态信息。它可以通过游标返回多个行的数据,或者通过输出参数将值传递回调用者。存储过程也可以不返回任何值,仅执行一系列数据库操作。

    • 例如,一个存储过程可以返回查询到的符合特定条件的客户列表,或者通过输出参数返回审批结果(批准或拒绝)。

  2. 自定义函数

    • 自定义函数必须返回一个值,其返回值类型可以是数据库支持的任何数据类型,如数值、字符串、日期等。

    • 例如,一个自定义函数可以返回客户的信用评分值,或者计算贷款的利息金额并返回。

三、调用方式

  1. 存储过程

    • 存储过程通常使用特定的语法进行调用,不同的数据库管理系统可能有不同的调用方式。在调用存储过程时,需要提供输入参数(如果有),并可以获取输出参数或结果集。

    • 例如,在 Oracle 数据库中,可以使用 "EXECUTE 存储过程名 (参数列表)" 的方式调用存储过程。

  2. 自定义函数

    • 自定义函数可以在 SQL 查询中像内置函数一样使用,直接在表达式中调用。调用自定义函数时,需要提供相应的参数,并将函数的返回值作为表达式的一部分进行处理。

    • 例如,在 SQL 查询中可以使用 "SELECT 自定义函数名 (参数列表) FROM 表名" 的方式调用自定义函数。

项目当中什么时候用到存储过程

对数据的ETL过程,对SQL语句进行优化,一些需要重复调用的过程,对数据库进行复杂操作,比如增删改,这些都需要用到存储过程。

注意:存储过程可以将复杂操作封装起来,与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。

写好的存储过程,部署好执行的先后顺序,通过自研工具(类似于Kettle)定时调度,最后进行跑批。

Q:写过最复杂的存储过程是什么?

答:最复杂的是统计交易明细表,因为粒度比较细,涉及到的表非常多,还要对交易类型和机构进行过滤等。写了1000多行代码。存储过程每个步骤都会记录日志,也会记录异常。

Q:存储过程如果出现异常怎么办?

答:在plsql中使用exception,在exception中把过程数据记录到错误日志表,然后对主过程的事务做回滚,并且针对异常我们会记录异常的日志,方便后续问题的分析。

Q:自己写存储过程要注意什么?

1、命名规范,比如存储过程命名sp目标表名,传入参数命名p参数名,变量命名v_变量名;

2、在存储过程中,数据表别名不能加as;

3、在存储过程中,select某一字段时,后面必须紧跟into(如果select整个记录,利用游标这种情况除外);

4、在利用select...into...语法时,要必须先确保数据库有该条语句;

5、在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行时会报错;

6、在存储过程中,注意出现null的情况。

Q:自定义函数有些过吗?自定义函数的存储过程的区别?

答:有用过 Oracle 的自定义函数,其实就是将某些查询或者计算方法封装成一个函数,类似于常用的 substr、replace 这样,可以避免重复开发,简化代码,提高工作的效率。有写过一些通用的,比较简单的,比如说计算年龄或者性别这种的。

都是封装一段 SQL 脚本,语法上可能差不多,但是自定义函数主要是用于封装一些查询计算类的语句,用于传入几个参数,返回某个具体的值;而存储过程主要是用于封装一些过程类的脚本,比如 delete、update、insert 这些,用于数据的处理。自定义函数还要求先声名返回值的类型,要有return。而存储过程中可以有return,只能 return null,但是可以使用out来传出一个值或者某个参数。

Q:如何找到存储过程哪个环节执行的快慢?

答:用日志是用来追溯问题的,记录整个程序的运行情况,知道哪个环节报错了,记录每一步花了多少时间,判断哪一步性能不好,从而对程序进行修改和优化。

Q:项目当中存储过程跑的很慢或者出现异常的原因可能是什么?

1、新增数据量太大;2、循环次数太多导致慢;3、索引失效;4、sql语句效率太低。 表结构可能会导致出现异常,比如之前表的某一个字段类型是varchar2(200),而新增的数据同一个字段类型是varchar2(20),这个时候在执行插入的操作就会出现异常。

存储过程的参数

  • IN 参数:表示输入参数,只能向存储过程传入值,不能被存储过程修改。

  • OUT 参数:表示输出参数,只能被存储过程赋值,不能向存储过程传入值。

  • IN OUT 参数:表示输入输出参数,既可以向存储过程传入值,也可以被存储过程修改并返回。

调用存储过程时,IN 参数可以直接传入值,OUT 和 IN OUT 参数需要使用变量来接收存储过程的返回值。

相关推荐
月亮月亮要去太阳8 小时前
Hadoop、Hive、Spark的关系
hive·hadoop·spark
Dragon--Z12 小时前
本地部署Hive集群
数据仓库·hive·hadoop
Arbori_2621513 小时前
大数据 spark hive 总结
大数据·hive·spark
qq_2573795917 小时前
Sqoop和Hive数据仓库速查笔记
数据仓库·hive·sqoop
昨天今天明天好多天19 小时前
【Hadoop】
大数据·hadoop·分布式
m0_7482548819 小时前
Python大数据可视化:基于Python的王者荣耀战队的数据分析系统设计与实现_flask+hadoop+spider
hadoop·python·flask
对许1 天前
Hadoop的运行模式
大数据·hadoop·分布式
向日葵花子(* ̄︶ ̄)2 天前
hive sql limit offset不起作用
hadoop
2302_799525742 天前
【Hadoop】如何理解MapReduce?
数据库·hadoop·mapreduce