2016-11-24 155 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/