繁体   English   中英

火花顺序通过结合几组

[英]spark orderBy combine few groups

我有这样的数据:

日期 标识
01.02.2002 AAA_111111
01.02.2002 BBB_222222

我计算重复项并将结果写入 csv 文件,我的代码如下:

(df.groupBy("Date", "Ident")
.agg(functions.count("*")))
.orderBy(functions.to_date(functions.column("Date"), "dd.MM.yyyy").cast(DateType).asc)
.write.format("csv").save(pathResult)

如果 df 大小约为 100 行,则每个文件都包含有关一个日期的数据。 像这样:

02.05.2020,AAA_111111,1
02.05.2020,AAA_111112,1
02.05.2020,AAA_111113,2
02.05.2020,AAA_111114,1
02.05.2020,AAA_111115,1

如果 df 大小约为 10000 行,则每个文件都包含有关少数日期的数据。 像这样:

02.05.2020,AAA_111111,1
02.05.2020,AAA_111112,1
.......................
03.05.2020,AAB_111113,2
03.05.2020,AAB_111114,1
.......................
04.05.2020,AAC_111115,1

可以使用partitionBy("Date") ,但这会为每一天创建单独的文件夹,并从 csv 中删除“Date”数据

是否可以在不使用partitionBy()的情况下将仅关于一个“日期”的数据写入一个文件?

对于任何 df 大小,我想在一个文件中仅获取有关一个日期的数据。

您可以尝试使用 k 个分区对日期列进行重新分区,其中 k 是不同的日期数。 就像是

val numPartitions = df.agg(countDistinct("Date")).first.getAs[Long](0).toInt

(df.groupBy("Date", "Ident")
.agg(functions.count("*")))
.orderBy(functions.to_date(functions.column("Date"), "dd.MM.yyyy").cast(DateType).asc)
.repartition(numPartitions, col("Date"))
.write.format("csv").save(pathResult)

这样,您最终将 k 个分区写入 k 个文件。 但是,不能保证每个文件只有一个日期,因为repartition使用HashPartitioner 具有相同日期的所有行都将位于同一个文件中,但如果发生哈希冲突,您将获得一个包含多个日期的文件和一个空文件。 您可以决定这是否适合您的用例。

如果这不可接受,您可能必须对文件进行一些后处理。 不幸的是,Spark 并没有为您提供很多文件输出结构的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM