如果初始 RDD 不为空,为什么 RDD.groupBy return 是一个空 RDD?

Why does RDD.groupBy return an empty RDD if the initial RDD wasn't empty?

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

(filename, List[Results])

由于文件被分成几个部分,RDD 中的多个条目的文件名是相同的。我正在尝试使用 reduceByKey 将每个部分的结果重新组合在一起。但是,当我尝试 运行 计数此 RDD 时,它 returns 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 命令 return 清空 RDD?

事实证明,我为该特定作业生成 Spark 配置的方式存在错误。 spark.default.parallelism 字段没有设置为合理的值,而是设置为 0。

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

Default number of partitions in RDDs returned by transformations like join, reduceByKey, and parallelize when not set by user.

因此,虽然像 collect() 这样的操作运行得非常好,但任何在不指定分区数的情况下重新排列数据的尝试都会给我一个空的 RDD。这将教会我信任旧的配置代码。