持续更新ing
Hive总结
1.left semi join:当join了多张表的时候,把semi join 放在最后面去,因为semi join右边的表只能用在它后面第一个on中,并且它查询出来的表是左边做完内连接之后的数据,不会再包含右表的数据。
2.distinct和group by都有去重的效果
3.让hive查询快一些
set hive.exec.mode.local.auto=true;
set hive.auto.convert.join=true;
4.hive中group by如果包含两个以及以上的字段,必须要全部字段都相同才能分为同一组,否则是不会分为同一组的
5.select优先级会高于order by,故窗口函数的排序要优先于order by,所以如果外面加了order by,那么窗口函数的排序失效
6.若内层查询用到了窗口函数,但是外层查询没有使用到内层查询中的窗口函数,则会导致内层查询中窗口函数所做的操作都会失效(包括窗口函数,分区,排序等)
内层查询如下
外层查询用到了窗口函数 row_number
外层查询没有用到窗口函数row_number,则会导致窗口函数排序失效
7.优先级:group by>select(窗口函数在select里面)>distinct,故在使用了窗口函数之后想去重应当使用distinct,而不是group by
8.join on中的on条件可以是=,>, <, <>, !=, IS NOT NULL, IS NULL
但是不能是OR,只能是AND
下图是测试条件
9.hive连接(全连接,左连接,右连接),先匹配on条件,若on条件没有匹配上,执行join则会产生null值
执行优先级on > join
当没有添加on条件时,right join、left join和join的效果是一样的
10.分区和分桶
分区是指分文件夹,多级分区指的是分多级的文件夹
分桶指的是将文件按照某种规则分成多个文件,美其名曰桶
11.复杂数据结构Array
建立含有Array类型的表的时候,不仅要指明字段之间的分隔符是什么(row format delimited fields terminated by ‘\t’),还要指明Array之间的元素分隔符是什么(collection items terminated by ‘,’),注意含有Array数据类型的表建立起来以后的表字段类型是下面这样的