簡體   English   中英

Apache Spark 按用戶 ID 對分區進行排序並將每個分區寫入 CSV

[英]Apache Spark sort partition by user ID and write each partition to CSV

我有一個使用 Spark 解決的用例似乎相對簡單,但似乎無法找到一種可靠的方法來做到這一點。

我有一個數據集,其中包含各種用戶的時間序列數據。 我要做的就是:

  • 按用戶 ID 分區此數據集
  • 對每個用戶的時間序列數據進行排序,然后應該包含在各個分區中,
  • 將每個分區寫入單個 CSV 文件。 最后,我希望每個用戶 ID 有 1 個 CSV 文件。

我嘗試使用以下代碼片段,但最終得到了令人驚訝的結果。 我最終會為每個用戶 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM