gpt4 book ai didi

java.lang.ClassCastException : scala. Tuple2 无法转换为 java.lang.Iterable

转载 作者:行者123 更新时间:2023-12-01 06:13:25 24 4
gpt4 key购买 nike

在Spark中使用Java,我想解析一个名为artist_data.txt的文本文档;我首先创建了JavaRDD;

JavaRDD rawArtistData = sc.textFile("src/main/resources/artist_data.txt");现在解析该文档,该文档有制表符,但也有坏行,其中行数似乎已损坏。它们不包含选项卡,或者它们无意中包含换行符。所以我需要使用 flatMap 方法;

现在通过运行下面的代码,我得到了一个错误;java.lang.ClassCastException:scala.Tuple2 无法转换为 java.lang.Iterable

JavaRDD<Tuple2<Integer, String>> artistByID0 = rawArtistData
.flatMap(new FlatMapFunction<String, Tuple2<Integer, String>>() {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public Iterable<Tuple2<Integer, String>> call(String s) {
String[] sarray = s.split("\t");
return (Iterable<Tuple2<Integer, String>>) new Tuple2<Integer, String>
(Integer.parseInt(sarray[0]), sarray[1].trim());
}
});


JavaPairRDD<Integer, String> artistByID = JavaPairRDD.fromJavaRDD(artistByID0);

System.out.println(artistByID.count());

最佳答案

发生这种情况是因为 flatMap 需要一个列表列表,它会将内部列表截断为一个列表。当您一次完成拆分和解析时,您实际上只需要 map 函数,它将直接返回 Tuple

flatMap 的一个更典型的用例是直接从拆分中返回数组,这将导致所有数组被截断为一个列表,以便您拥有所有单词而不是一堆单词单独的单词列表。

根据您的评论,听起来您显示的代码示例并未显示您的真实用例。如果您有可能由于错误数据而返回任何内容,那么您可能需要如下所示的内容:

JavaRDD<Tuple2<Integer, String>> artistByID0 = rawArtistData
.flatMap(new FlatMapFunction<String, Tuple2<Integer, String>>() {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public Iterable<Tuple2<Integer, String>> call(String s) {
String[] sarray = s.split("\t");
List<Tuple2<Integer, String>> returnList = new ArrayList<Tuple2<Integer, String>>();
if(sarray.length >= 2)
returnList.add(new Tuple2<Integer, String> (Integer.parseInt(sarray[0]), sarray[1].trim()));
return returnList;
);
}
});

请注意,如果拆分成功拆分为 2 个或更多项目,现在只会返回其中包含项目的列表。

关于java.lang.ClassCastException : scala. Tuple2 无法转换为 java.lang.Iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30646136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com