如何使用Spark JavaRDD将列拆分为多行

如何使用Spark JavaRDD将列拆分为多行,java,scala,apache-spark,rdd,Java,Scala,Apache Spark,Rdd,正在加载数据: SparkConf sc=new SparkConf().setAppName(“TEST”).setMaster(“local[*]); JavaSparkContext JSC=新的JavaSparkContext(sc); JavaRDD stringRDDVotes=JSC.textFile(“HarryPotter.csv”); 我目前已将此表加载到RDD中: 身份证件 A. B 名称 1. 23 50 骚扰陶工 第一部分很容易从Scala转换为Java,您只需要使用

正在加载数据:

SparkConf sc=new SparkConf().setAppName(“TEST”).setMaster(“local[*]);
JavaSparkContext JSC=新的JavaSparkContext(sc);
JavaRDD stringRDDVotes=JSC.textFile(“HarryPotter.csv”);
我目前已将此表加载到RDD中:

身份证件 A. B 名称 1. 23 50 骚扰陶工
第一部分很容易从Scala转换为Java,您只需要使用
map
将每一行用逗号分隔,就可以得到
JavaRDD
。然后使用
flatMap
,对于每一行,分割与
Name
对应的数组的最后一部分,并使用java流,可以将名称列表的每个元素转换为新列表

下面是一个完整的示例:

JavaRDD<String> input = JSC.parallelize(
        Arrays.asList("1,23,50,Harry;Potter", "2,24,60,Hermione;Granger")
);

JavaRDD<String[]> result = input.map(line -> line.split(","))
        .flatMap(r -> {
            List<String> names = Arrays.asList(r[3].split(";"));

            String[][] values = names.stream()
                    .map(name -> new String[]{r[0], r[1], r[2], name})
                    .toArray(String[][]::new);

            return Arrays.asList(values).iterator();
        });

// print the result RDD
for (String[] line : result.collect()) {
    System.out.println(Arrays.toString(line));
}
// [1, 23, 50, Harry]
// [1, 23, 50, Potter]
// [2, 24, 60, Hermione]
// [2, 24, 60, Granger]
javarddinput=JSC.parallelize(
数组.asList(“1,23,50,哈利;波特”,“2,24,60,赫敏;格兰杰”)
);
javarddresult=input.map(line->line.split(“,”))
.flatMap(r->{
列表名称=数组.asList(r[3].split(“;”);
字符串[][]值=名称。流()
.map(名称->新字符串[]{r[0],r[1],r[2],名称})
.toArray(字符串[]:[]::新建);
返回Arrays.asList(values.iterator();
});
//打印结果RDD
for(字符串[]行:result.collect()){
System.out.println(Arrays.toString(line));
}
//[1,23,50,哈利]
//[1,23,50,波特]
//[2,24,60,赫敏]
//[2,24,60,格兰杰]

您的代码应该可以工作,不是吗?@mck it sorta可以工作,问题是此代码拆分了Name列,但没有用新列写入ID、A和B。所以它变成了
ID,A,B,Name(哈利)
Name(波特)
谢谢你,这是有效的,我现在唯一的问题是,我想在RDD上运行
.filter
,但这似乎不起作用。所以,是否有其他方法可以代替
Arrays.asList(values.iterator()
?@FlubberBeer在java中使用
flatMap
时,需要返回迭代器。看见过滤器会遇到什么问题?我想检查名字为harry的人数,如下所示
result.filter(row->row.toString().contains(“harry”)).count()
,但这只是返回0@FlubberBeer您可以使用
result.filter(r->Arrays.asList(r).contains(“Harry”)).count()进行筛选
。或者更简单:
result.filter(r->r[3].equals(“Harry”)).count()