group by A,B,C

ABC的先后,对查询的最终结果值没有影响;

但是分组排序的逻辑是:

先按照A进行字典排序,默认升序,

然后当A相同时,对B进行字典排序,默认升序,

最后当B相同时,对C进行字典排序,默认升序。

所以ABC的分组字段先后顺序,对排序结果有影响,但是对最终查询的结果数值没有影响

但是以上并不意味着group by后A相等的数据一定全部在一块,因为hive或者spark计算时,

会将任务拆分成多个task即mr过程去处理,最终多少个reducer/分区task,就会产生多少个part文件,我们最终查询到的结果实际上是所有part文件的union结果,每个task内group by相同的字段在一起,最终呈现的结果就是group by相同的字段一块一块的,一块在一起,间隔一块又在一起,这就是多个part文件叠加在一起造成的结果

A        B         C
1        1         1
1        1         2
1        2         1
3        5         1
4        7         1
1        1         1
1        1         1
2        4         1

以上很明显,group by A,B,C后,A的值为1时,所有数据并不是全部聚合在一块的,很明显被中间的第4、5行隔开了,这就是多个part文件union造成的结果。

HDFS中,198就是文件个数,包含_SUCCESS文件,part从0000开始,到0196,一共198个文件

drwxrwxrwx   3 username password   198 2022-03-03 11:56 HDFS路径/event_day=20220114

如果想最终group by A,B,C的结果,数值相同的全部在一块,显示最好的效果,需要把最终输出分区数调为1,最终所有文件合并成一个part文件输出才行。

如何控制spark作业文件输出的个数

Spark支持控制输出文件个数的方式一共四种: spark.sql.shuffle.partitions、spark.default.parallelism、spark.repartition和coalesce。

这三种方式的区别是:

spark.sql.shuffle.partitions: 作用于SQL/DATAFRAME,仅适用于存在shuffle的作业,通过设置shuffle partition个数来限制最终产出个数。注意: 此方式会导致整个查询的shuffle partition个数均受影响,query复杂时不建议用此配置控制输出个数
spark.default.parallelism: 作用于RDD,仅适用于存在shuffle的作业,通过设置shuffle partition个数来限制最终产出个数。注意: 此方式会导致整个查询的shuffle partition个数均受影响,query复杂时不建议用此配置控制输出个数
REPARTITION(num): 对所有作业均生效,通过增加shuffle的方式,增加新的stage并指定partition个数最终产出正常的文件个数。注意: 此方式会额外增加shuffle,当最后输出之前计算量大时建议使用此配置
COALESCE(num): 仅适用于存在shuffle的作业,不会增加shuffle,这个参数直接影响stage并指定partition个数,从而影响最终产出文件个数。注意: 此方式不会额外增加shuffle,当最后输出之前计算量大时不建议此配置,只有计算量小(例如filter、where等)时才使用此配置

spark.sql.shuffle.partitions和spark.default.parallelism均是配置参数,使用时配置即可,针对整个job生效,就不介绍具体使用方式了。下面主要针对REPARTITION和COALESCE介绍

  • SQL
    SQL模式对REPARTITION和COALESCE以HINT的方式提供支持。样例case如下:
select /*+ REPARTITION(5) */ * from table;
select /*+ COALESCE(5) */ * from table;
  • Python和Scala
    Python和Scala通过API的方式提供REPARTITION和COALESCE提供支持,样例case如下:
spark.table("table").groupBy("a").repartition(5)
spark.table("table").groupBy("a").coalesce(5)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐