我有一个不同用户的表,其中有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分组和按部分计数,有些用户位于两个或多个部分。
我仍然不知道为什么?
答案 0 :(得分:1)
我找到了解决方案:在拆分之前缓存DataFrame。
应该是
val data = userList.cache().randomSplit(nsizes)
仍然不知道为什么。我的猜测,每次randomSplit
功能"填充" data
,它从userList
读取记录,这些记录是从镶木地板文件中重新评估的,并给出不同的行顺序,这就是为什么有些用户会丢失的原因以及一些用户是重复的。
这就是我的想法。如果有人有任何答案或解释,我会更新。
参考文献:
答案 1 :(得分:0)
如果您的目标是将其拆分为不同的文件,您可以使用functions.hash来计算哈希值,然后使用mod 4来获得0到4之间的数字,当您编写镶木地板时使用partitionBy将创建一个目录4个值中的每一个。