将Spark DataFrame拆分为多个部分

时间:2016-11-24 12:02:06

标签: scala apache-spark

我有一个不同用户的表,其中有400,000个用户。我想将它分成4个部分,并期望每个用户只位于一个部分。

这是我的代码:

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

然后我将 0 中的每个data(i) i 写入 3 ,放入镶木地板文件中。选择目录,按用户ID分组和按部分计数,有些用户位于两个或多个部分。

我仍然不知道为什么?

2 个答案:

答案 0 :(得分:1)

我找到了解决方案:在拆分之前缓存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/

答案 1 :(得分:0)

如果您的目标是将其拆分为不同的文件,您可以使用functions.hash来计算哈希值,然后使用mod 4来获得0到4之间的数字,当您编写镶木地板时使用partitionBy将创建一个目录4个值中的每一个。