函数
UDF:用户定义函数
UDAF:用户定义聚集函数
UDTF:用户定义表生成函数
建表优化
分区建桶
- 创建表时指定分区字段
PARTITIONED BY (date string)
- 指定分桶字段和数量 ·CLUSTERED BY (id) INTO 10 BUCKETS·
- 插入数据按分区、分桶字段插入
提高查询速度(查询范围减少),数据聚集性增强,减少连接操作数据流传输
Union
Union
- 去重
- 排序
- 性能较低
Union all - 不去重
- 不排序
优化
压缩
- map阶段压缩(orcfile/parquet算法)
set hive.exec.compress.intermediate=true
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec
set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
- 输出结果压缩(snappy)
set hive.exec.compress.output=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
- 建表时候压缩
环境参数
参数优化
// 让可以不走mapreduce任务的,就不走mapreduce任务
hive> set hive.fetch.task.conversion=more;
// 开启任务并行执行
set hive.exec.parallel=true;
// 解释:当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all的时候)
// 同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;
// 设置jvm重用
// JVM重用对hive的性能具有非常大的 影响,特别是对于很难避免小文件的场景或者task特别多的场景,这类场景大多数执行时间都很短。jvm的启动过程可能会造成相当大的开销,尤其是执行的job包含有成千上万个task任务的情况。
set mapred.job.reuse.jvm.num.tasks=10;
// 合理设置reduce的数目
// 方法1:调整每个reduce所接受的数据量大小
set hive.exec.reducers.