zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    HDU2201
    HDU2202 凸包
    HDU 4353 几何
    POJ2031 prim
    HDU1392 凸包
    HDU1689 BFS+最小奇数环
    设计模式 [转]
    Mining Massive Data Sets PPT
    C++编程命名规范 [转]
    static_cast与dynamic_cast转换 [转]
  • 原文地址:https://www.cnblogs.com/ytwang/p/13646099.html
Copyright © 2011-2022 走看看