如何使用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()