UDF、UDAF、UDTF的区别
UDF(User-Defined-Function)一进一出
UDAF(User-Defined Aggregation Funcation)聚集函数,多进一出
UDTF(User-Defined Table-Generating Functions)一进多出,如lateral view explore()
hive udf永久生效
1、将JAVA类打jar包并上传至hdfs中。
2、进入hive,执行脚本上 增加命令CREATE FUNCTION default.add AS 'com.bigdata.Add' USING JAR 'hdfs://service/add.jar';
hive中order by ,sort by ,distribute by, cluster by 的区别
order by : 全局排序
sort by : 每个redues 排序
distribute : 根据指定的字段将数据分到不同的reducer,且分发算法是hash散列
cluster by = distribute by+sort by
hive中组内排序
ROW_NUMBER() 是没有重复值的排序(即使两条记录相同,序号也不重复的),不会有同名次。
DENSE_RANK() 是连续的排序,两个第二名仍然跟着第三名。
RANK() 是跳跃排序,两个第二名下来就是第四名。
组内排序 获取topn
名称分组,级别top1的
select
a.*
from
(
select name row_number() over (partition by name order by level desc ) as r
from table_name
) a
where a.<=1
Hive压缩
三个阶段
第一阶段 是否可以分片的压缩(bzip2)。
第二阶段 shuffle的数据应该选择速度比较快的压缩(snappy)
第三阶段 reduce放磁盘就可以使用较高的压缩比节省磁盘空间(bzip2)
hive join
join会产生shuffle的
普通join也叫 shuffle join 或者 reducer join 真正的join是在reducer完成的
join可以不产生shuffle 小表数据生产hashtable files放入hadoop分布式缓存,也叫mapjoin
hive参数调优
1并行计算parallel
当一个sql中有多个job时候,且这多个job之间没有依赖,则可以让顺序执行变为并行执行(一般为用到union all )
开启任务并行执行
set hive.exec.parallel=true;
同一个sql允许并行任务的最大线程数
set hive.exec.parallel.thread.number=8;
2 hive jvm重用在mapre-site.xml文件里设置
set mapred.job.reuse.jvm.num.tasks=10;
3设置reduce的数目
set mapred.reduce.tasks = number
4explain关键字解释语句
解释成表达式树
5合并小文件Mapper
set mapred.max.split.size=256000000;
//一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node=100000000;
//一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack=100000000;
//执行Map前进行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
//设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true
//设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true
//设置合并文件的大小
set hive.merge.size.per.task = 256*1000*1000
//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000
1. 将大表放后头
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。因此通常需要将小表放前面,或者标记哪张表是大表:/*streamtable(table_name) */
2. 使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
3. 尽量尽早地过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。