Hive的一些常用的高阶开发
内容
1.开窗函数
2.行转列,列转行,多行转一行,一行转多行
3.分组: 增强型group
4.排序
5.关联
本次的内容: 分组 排序 关联
1.分组
GROUP BY
GROUP BY WITH rollup
GROUP BY WITH cube
GROUP BY GROUPING sets()
GROUPING SETS 的 GROUP BY 子句可以生成一个等效于由多个简单 GROUP BY 子句的 UNION ALL 生成的结果
GROUPING SETS在遇到多个条件时,
聚合是一次性从数据库中取出所有需要操作的数据,在内存中对数据库进行聚合操作并生成结果。
UNION ALL 是多次扫描表,将返回的结果进行UNION操作.
这也就是为什么 GROUPING SETS 和 UNION 操作所返回的数据顺序是不同的.
使用union操作会增加IO开销,会减少cpu和内存的开销,使用 grouping sets 会减少IO开销,会增加cpu和内存的消耗.
grouping sets 的执行方式在group by后面有多列的时候, grouping sets 带来的性能提升非常明显
eg:
group by A,B grouping sets(A,B) 就等价于 group by A union group by B
group by A,B,C grouping sets((A,B),(A,C)) 等价于 group by A,B union group by A,C
rollup:在指定表达式的 每个层次级别 创建分组集。
group by A,B,C with rollup
首先会对(A、B、C)进行group by,然后对(A、B)进行group by,然后是(A)进行group by,
最后对全表进行group by操作
cube: 在指定表达式集的 每个可能组合 创建分组集。
group by A,B,C with cube
首先会对(A、B、C)进行group by,然后依次是(A、B),(A、C),(A),(B、C),(B),( C),
最后对全表进行group by操作。
2.排序
全局排序
ORDER BY
局部排序
cluster BY 约等于 distribute BY + sort BY 因为 cluster 只能升序
distribute BY
sort BY
这里以SparkSQL为例
示例:
SELECT * FROM df DISTRIBUTE BY KEY 【Equivalent in DataFrame API】: df.repartition($"key", 2)
SELECT * FROM df SORT BY KEY 【Equivalent in DataFrame API】: df.sortWithinPartitions()
SELECT * FROM df CLUSTER BY KEY 【Equivalent in DataFrame API】: df.repartition($"key", 2).sortWithinPartitions()
repartition 和 partitionBy 都是对数据进行重新分区,
partitionBy 只能用于 PairRDD。repartition适用于各种。
repartition 使用了一个随机生成的数来当做 Key,而不是使用原来的 Key,这和 partitionBy 不同
两者默认都是使用 HashPartitioner
二次排序
使用 partitionBy 和 sort BY
Spark 提供了 repartitionAndSortWithinPartitions 给算子可以通过指定的分区器进行分组,并在分组内排序
参考: Optimize Spark with DISTRIBUTE BY & CLUSTER BY
https://deepsense.ai/optimize-spark-with-distribute-by-and-cluster-by/3.关联:
01.语法:
FULL JOIN
LEFT JOIN | RIGHT JOIN
INNER JOIN
CROSS JOIN
02.原理实现层
SparkSQL支持三种Join算法:
shuffle hash JOIN
broadcast hash JOIN
sort merge JOIN
hash join算法来自于传统数据库,而shuffle和broadcast是 分布式
shuffle hash JOIN
shuffle阶段: 分别将两个表按照join key进行分区,将相同join key的记录重分布到同一节点,
两张表的数据会被重分布到集群中所有节点。这个过程称为shuffle。
hash join阶段:每个分区节点上的数据单独执行单机hash join算法
SparkSQL对两张大表join采用了全新的算法-sort-merge JOIN
shuffle阶段:将两张大表根据join key进行重新分区,两张表数据会分布到整个集群,以便分布式并行处理。
sort 阶段:对单个分区节点的两表数据,分别进行排序。
MERGE 阶段:对排好序的两张分区表数据执行join操作。
join操作很简单,分别遍历两个有序序列,碰到相同join key就merge输出,否则取更小一边
代价:
代价关系:cost(broadcast hash join) < cost(shuffle hash join) < cost(sort merge join)