HIVE知识点汇总

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. 尽量尽早地过滤数据

减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。

猜你喜欢

转载自blog.csdn.net/lucklilili/article/details/105071387