[英]Spark load a csv into JavaPairRDD by key found in row
我想使用行中的值作為鍵,並將行本身作為值,將csv加載到JavaPairRDD中。 目前,我正在這樣做:
我有一個這樣的csv行:
a,1,1,2
b,1,1,2
a,2,2,3
b,2,2,3
我有一個Java對象代表這些行,如下所示:
public class FactData implements Serializable{
public String key;
public int m1;
public int m2;
public int m3;
}
我目前正在這樣進入pairRDD:
JavaRDD<FactData> lines = sc.textFile("test.csv").map(line -> FactData.fromFileLine(line));
JavaPairRDD<String, Iterable<FactData>> groupBy = lines.groupBy(row -> row.getId());
但是我想知道是否有更快/更好的方法來做到這一點? 就像是:
JavaPairRDD<String,Iterable<FactData>> groupedLines = sc.textFile("test.csv").flatMapToPair(new PairFlatMapFunction<String, String, Iterable<FactData>>() {
@Override
public Iterator<Tuple2<String, Iterable<FactData>>> call(String s) throws Exception {
//WHAT GOES IN HERE?
return null;
}
});
任何想法表示贊賞。
為什么不使用keyBy。
假設您希望將文件的第一個值作為鍵,將總行作為值。 比您可以簡單地做到這一點。
JavaRDD<String> lines = context.textFile("test.csv");
JavaPairRDD<String, String> newLines = lines.keyBy(new Function<String,String>(){
@Override
public String call(String arg0) throws Exception {
return arg0.split(",")[0];
}
});
如果您想收集為地圖,也許可以這樣做。
JavaPairRDD<String, Iterable<String>> newLines = lines.keyBy(new Function<String,String>(){
@Override
public String call(String arg0) throws Exception {
return arg0.split(",")[0];
}
}).mapValues(new Function<String, Iterable<String>>(){
@Override
public Iterable<String> call(String arg0) throws Exception {
return Arrays.asList(arg0.split(","));
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.