2016-11-24 151 views
2

我有一個不同用戶的表,其中有400,000個用戶。我想將其分成4個部分,並且預計每個用戶只能位於一個部分。將Spark數據幀拆分爲部分

這裏是我的代碼:

val numPart = 4 
val size = 1.0/numPart 
val nsizes = Array.fill(numPart)(size) 
val data = userList.randomSplit(nsizes) 

然後我寫的每一個data(i)從到,到拼花文件。選擇目錄,按用戶ID分組並且按部分計數,有一些用戶位於兩個或更多部分。

我還不知道爲什麼?

回答

0

如果你的目標是將它分割成不同的文件,你可以使用functions.hash來計算一個散列,然後mod 4得到一個介於0到4之間的數字,當你寫入parquet的時候使用partitionBy來創建一個目錄對於4個值中的每一個。

0

我找到了解決方案:在分割之前緩存DataFrame。

應該

val data = userList.cache().randomSplit(nsizes) 

仍然不知道爲什麼。我的猜測是,每當randomSplit函數「填充」data時,它會從userList中讀取記錄,這些記錄將從地板文件中重新評估,並給出不同的行順序,這就是爲什麼某些用戶丟失並且某些用戶複製。

這就是我的想法。如果有人有任何答案或解釋,我會更新。

參考文獻:

  1. (Why) do we need to call cache or persist on a RDD
  2. https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-rdd-caching.html
  3. http://159.203.217.164/using-sparks-cache-for-correctness-not-just-performance/