簡體   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