Java 如何在嵌套映射函数中求解SPARK-5063

Java 如何在嵌套映射函数中求解SPARK-5063,java,nested,apache-spark,Java,Nested,Apache Spark,RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x=>rdd2.values.count()*x)无效,因为无法在rdd1.map转换内部执行值转换和计数操作。有关更多信息,请参阅SPARK-5063 正如错误所说,我试图在主映射函数中映射(转换)一个JavaRDD对象,ApacheSpark怎么可能呢 主要JavaPairRDD对象(TextFile和Word是定义的类): 我还尝试了foreach映射函数,但不起作用。(当然也搜索了SPARK-5063)同

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

正如错误所说,我试图在主映射函数中映射(转换)一个JavaRDD对象,ApacheSpark怎么可能呢

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


我还尝试了foreach映射函数,但不起作用。(当然也搜索了SPARK-5063)

同样,RDD上的嵌套操作不受支持,SPARK中不可能使用嵌套的RDD类型。RDD仅在驱动程序中定义,在驱动程序中,RDD与它们的
SparkContext
相结合,可以对它们所表示的数据安排操作

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

JavaPairRDD<TextFile, JavaRDD<Word>> filesWithWords
javapairdd文件和单词
在Spark中没有可能的有效用途。根据问题中未进一步解释的用例,此类型应成为以下类型之一:

RDD的集合及其引用的文本文件:

Map<TextFile,RDD<Word>>
Map
或按文本文件列出的(文本文件、Word)集合:

JavaPairRDD<TextFile, Word>
javapairdd
或一组单词及其对应的文本文件:

JavaPairRDD<TextFile, List<Word>>
javapairdd

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

当我在Spark学习曲线中达到这个完全相同的点时(尝试使用嵌套RDD但失败了),我切换到数据帧,并能够使用连接来完成同样的事情。而且,一般来说,数据帧的速度几乎是RDD的两倍——至少在我所做的工作中是如此 首先,我使用了javapairdd,但它没有像您和@davidgriffin所说的那样工作,现在还不可能。 型号:

文本文件(字符串路径、字符串文本)

字(字符串字、整数计数)

现在使用的是JavaRDD,模型已更改为:

文本文件(字符串路径、字符串文本、列表wordList)

字(字符串字、整数计数)

最后,

List<Word> countDrafts = wordCount.map(v11 -> new Word(v11._1(), (long) 0)).collect();
JavaRDD<TextFile> ft = fileTexts.map(v11 -> new TextFile(v11._1(), v11._2(), countDrafts));
ft.foreach(textFile -> textFile.getWordList().forEach(word -> new  Word(word.getText(), getWordCountFromText(textFile.getText(), word.getText())))); 
List countDrafts=wordCount.map(v11->new Word(v11._1(),(long)0)).collect();
JavaRDD ft=fileTexts.map(v11->newtextfile(v11._1(),v11._2(),countDrafts));
ft.foreach(textFile->textFile.getWordList().foreach(word->newword(word.getText(),getWordCountFromText(textFile.getText(),word.getText())));
getWordCountFromText()函数计算TextFile对象文本中的单词,但不幸的是,没有使用spark reduce方法,而是使用经典方法

顺便说一句,我将在接下来的几天内尝试数据帧,但我的时间很短


谢谢大家。

另请参见:非常感谢您的回答。我试着像这样使用Map:Map textMap=filesWithWords.collectAsMap();forEach((textFile,wordJavaRDD)->wordJavaRDD.map(word->/*一些转换*/);但是再次返回相同的错误。@Alp
collectAsMap()
将不会返回
Map
。顺便说一句,你想做什么?在我看来,您尝试的构造似乎相当做作。
collectAsMap()
给出了map(
java.util.map
),我已经检查过了。我想你的意思是
scala.collection.Map
?TextFile类具有任何文件的路径和文本属性,Word类具有Word及其计数,我正在尝试计算当前文本文件中的每个单词。另外,
JavaRDD
包含所有文本文件中使用的所有单词,而不仅仅是当前文件,所以我不能使用简单的单词计数examples@Alp这是单词计数的扩展,而是计数(文件、单词)对。为什么不呢?也许你可以用你正在尝试的代码发布另一个问题。这种方法应该是有效的,所以可能是与代码相关的问题。与其写一个答案来回应maasg和David的答案,你可能想用上面的信息编辑你的帖子并删除这个答案。@MikelUrkia@maasg说的是你可能想用你正在尝试的代码写一个新问题,而不是对你现有问题的答案,主要是因为你在他的回答中发现的新问题与这个问题中的问题不同。这样你就更容易回答你的新问题了。这没什么大不了的,也不应该。“这是我对我的问题的一个明确回答,对于那些面临同样问题的开发者来说,也许你是对的,@Alp。你回答了你的问题,这是真的。只是想帮你解决新问题。干杯
JavaPairRDD<TextFile, List<Word>>
List<Word> countDrafts = wordCount.map(v11 -> new Word(v11._1(), (long) 0)).collect();
JavaRDD<TextFile> ft = fileTexts.map(v11 -> new TextFile(v11._1(), v11._2(), countDrafts));
ft.foreach(textFile -> textFile.getWordList().forEach(word -> new  Word(word.getText(), getWordCountFromText(textFile.getText(), word.getText()))));