[英]Apache Spark sort partition by user ID and write each partition to CSV
我有一個使用 Spark 解決的用例似乎相對簡單,但似乎無法找到一種可靠的方法來做到這一點。
我有一個數據集,其中包含各種用戶的時間序列數據。 我要做的就是:
我嘗試使用以下代碼片段,但最終得到了令人驚訝的結果。 我最終會為每個用戶 ID 生成 1 個 csv 文件,並且一些用戶的時間序列數據確實最終得到了排序,但許多其他用戶的數據沒有排序。
# repr(ds) = DataFrame[userId: string, timestamp: string, c1: float, c2: float, c3: float, ...]
ds = load_dataset(user_dataset_path)
ds.repartition("userId")
.sortWithinPartitions("timestamp")
.write
.partitionBy("userId")
.option("header", "true")
.csv(output_path)
我不清楚為什么會發生這種情況,我也不完全確定如何做到這一點。 我也不確定這是否是 Spark 中的潛在錯誤。
我在 Python 2.7.12 中使用 Spark 2.0.2。 任何建議將不勝感激!
以下代碼適用於我(此處以 Scala 顯示,但與 Python 類似)。
我為每個用戶名獲取一個文件,輸出文件中的行按時間戳值排序。
testDF
.select( $"username", $"timestamp", $"activity" )
.repartition(col("username"))
.sortWithinPartitions(col("username"),col("timestamp")) // <-- both here
.write
.partitionBy("username")
.mode(SaveMode.Overwrite)
.option("header", "true")
.option("delimiter", ",")
.csv(folder + "/useractivity")
進口的是有兩個用戶名和時間戳列作為參數傳遞給sortWithinPartitions。
以下是其中一個輸出文件的外觀(我使用了一個簡單的整數作為時間戳):
timestamp,activity
345,login
402,upload
515,download
600,logout
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.