group by多个字段的顺序和分块问题/hive spark合并输出文件
group by A,B,CABC的先后,对查询的最终结果值没有影响;但是分组排序的逻辑是:先按照A进行字典排序,默认升序,然后当A相同时,对B进行字典排序,默认升序,最后当B相同时,对C进行字典排序,默认升序。所以ABC的分组字段先后顺序,对排序结果有影响,但是对最终查询的结果数值没有影响...
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)
更多推荐
所有评论(0)