如果初始RDD不为空,为什么RDD.groupBy返回空的RDD?

时间:2015-09-30 19:04:54

标签: scala apache-spark rdd

我有一个RDD,我用它来加载二进制文件。每个文件分为多个部分并进行处理。处理步骤之后,每个条目都是:

(filename, List[Results])

由于文件分为几个部分,因此RDD中的几个条目的文件名相同。我尝试使用reduceByKey将每个部分的结果重新组合在一起。但是,当我尝试对此RDD运行计数时,它返回0:

val reducedResults = my_rdd.reduceByKey((resultsA, resultsB) => resultsA ++ resultsB)
reducedResults.count() // 0

我尝试更改其使用的密钥但没有成功。即使只是非常简单地尝试对结果进行分组,我也无法获得任何输出。

val singleGroup = my_rdd.groupBy((k, v) => 1) 
singleGroup.count() // 0

另一方面,如果我只是收集结果,那么我可以将它们分组到Spark之外,一切正常。但是,我仍然需要对收集的结果进行额外的处理,因此这不是一个好的选择。

如果初始RDD不为空,会导致groupBy / reduceBy命令返回空RDD的原因是什么?

1 个答案:

答案 0 :(得分:1)

原来我在如何为该特定作业生成Spark配置时出现了一个错误。不是将spark.default.parallelism字段设置为合理的,而是将其设置为0.

来自spark.default.parallelism上的Spark文档:

  

当用户未设置时,由join,reduceByKey和parallelize等转换返回的RDD中的默认分区数。

因此,虽然像collect()这样的操作完全正常,但是在没有指定分区数量的情况下重新调整数据的任何尝试都给了我一个空的RDD。这将教我相信旧的配置代码。