hive函数
1. Hive函数分类
1.1 从输入输出角度分类
- 标准函数:一行数据中的一列或多列为输入,结果为单一值
- 聚合函数:多行的零列到多列为输入,结果为单一值
- 表生成函数:零个或多个输入,结果为多列或多行
1.2 从实现方式分类
- 内置函数
- 标准函数
①字符函数
②类型转换函数
③数学函数
④日期函数
⑤集合函数
⑥条件函数
- 聚合函数
- 表生成函数
- 标准函数
- 自定义函数
- UDF:自定义标准函数
- UDAF:自定义聚合函数
- UDTF:自定义表生成函数
1.3 具体函数
-
字符函数
-
数据转换函数
-
数学函数
-
日期函数
-
集合函数
-
条件函数
-
表生成函数
2. hive性能调优
2.1 Hive性能调优工具
- EXPLAIN
- ANALYZE
分析表数据,用于执行计划选择的参考
收集表的统计信息,如行数、最大值等
使用时调用该信息加速查询
语法
ANALYZE TABLE employee COMPUTE STATISTICS;
ANALYZE TABLE employee_partitioned
PARTITION(year=2014, month=12) COMPUTE STATISTICS;
ANALYZE TABLE employee_id COMPUTE STATISTICS
FOR COLUMNS employee_id;
2.2 Hive优化设计
使用分区表、桶表
使用索引
使用适当的文件格式,如orc, avro, parquet
使用适当的压缩格式,如snappy
考虑数据本地化 - 增加一些副本
避免小文件
使用Tez引擎代替MapReduce
使用Hive LLAP(在内存中读取缓存)
考虑在不需要时关闭并发
2.3 Job优化
- 本地模式运行
- Hive支持将作业自动转换为本地模式运行
当要处理的数据很小时,完全分布式模式的启动时间比作业处理时间要长
设置开启本地模式
SET hive.exec.mode.local.auto=true;
--default false
SET hive.exec.mode.local.auto.inputbytes.max=50000000;
–
SET hive.exec.mode.local.auto.input.files.max=5;
--default 4
ob必须满足以下条件才能在本地模式下运行 - Job总输入大小小于 hive.exec.mode.local.auto. inputbytes.max
map任务总数小于 hive.exec.mode.local.auto. input.files.max
所需的Reduce任务总数为1或0
- Hive支持将作业自动转换为本地模式运行
- JVM重用(JVM Reuse)
- 通过JVM重用减少JVM启动的消耗
默认每个Map或Reduce启动一个新的JVM
Map或Reduce运行时间很短时,JVM启动过程占很大开销
通过共享JVM来重用JVM,以串行方式运行MapReduce Job
适用于同一个Job中的Map或Reduce任务
对于不同Job的任务,总是在独立的JVM中运行 - 设置开启JVM重用
set mapred.job.reuse.jvm.num.tasks = 5;
– 默认值为1
- 通过JVM重用减少JVM启动的消耗
- 并行执行
- 并行执行可提高集群利用率
Hive查询通常被转换成许多按默认顺序执行的阶段
这些阶段并不总是相互依赖的
它们可以并行运行以节省总体作业运行时间
如果集群的利用率已经很高,并行执行帮助不大 - 通过以下设置开启并行执行
SET hive.exec.parallel=true;
– default false
SET hive.exec.parallel.thread.number=16;
– default 8,定义并行运行的最大数量
- 并行执行可提高集群利用率
2.4 查询优化
- 自动启动Map端Join
- 防止数据倾斜
set hive.optimize.skewjoin=true; - 启用CBO(Cost based Optimizer)
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true; - 启动Vectorization(矢量化)
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true; - 使用CTE、临时表、窗口函数等正确的编码约定
2.5 压缩算法
- 减少传输数据量,会极大提升MapReduce性能
采用数据压缩是减少数据量的很好的方式 - 常用压缩方法对比