如何在嵌套地图函数中解决SPARK-5063

Alp*_*per 7 java nested apache-spark

RDD转换和操作只能由驱动程序调用,而不能在其他转换内部调用; 例如,rdd1.map(x => rdd2.values.count()*x)无效,因为无法在rdd1.map转换中执行值转换和计数操作.有关更多信息,请参阅SPARK-5063.

正如错误所说,我正在尝试在主映射函数中映射(转换)JavaRDD对象,Apache Spark怎么可能?

主JavaPairRDD对象(TextFile和Word是定义的类):

JavaPairRDD<TextFile, JavaRDD<Word>> filesWithWords = new...
Run Code Online (Sandbox Code Playgroud)

和地图功能:

filesWithWords.map(textFileJavaRDDTuple2 -> textFileJavaRDDTuple2._2().map(word -> new Word(word.getText(), (long) textFileJavaRDDTuple2._1().getText().split(word.getText()).length)));
Run Code Online (Sandbox Code Playgroud)

我也试过foreach而不是map功能,但没有工作.(当然搜索SPARK-5063)

maa*_*asg 9

同样,不支持对RDD的嵌套操作,Spark中不能使用嵌套的RDD类型.RDD仅在驱动程序中定义,结合它们,SparkContext它们可以对它们所代表的数据进行操作.

因此,在这种情况下我们需要解决的根本原因是数据类型:

JavaPairRDD<TextFile, JavaRDD<Word>> filesWithWords
Run Code Online (Sandbox Code Playgroud)

哪个在Spark中没有可能的有效用途.根据用例(在问题中没有进一步解释),此类型应成为以下类型之一:

RDD的集合,包含它们引用的文本文件:

Map<TextFile,RDD<Word>>
Run Code Online (Sandbox Code Playgroud)

或者通过文本文件收集(textFile,Word):

JavaPairRDD<TextFile, Word>
Run Code Online (Sandbox Code Playgroud)

或者带有相应TextFile的单词集合:

JavaPairRDD<TextFile, List<Word>>
Run Code Online (Sandbox Code Playgroud)

一旦类型得到纠正,嵌套RDD操作的问题将自然得到解决.