Hive 高阶应用开发示例(二)

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)

原文地址:https://www.cnblogs.com/ytwang/p/13646099.html