我想将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;
}
我目前正在接受这样的对抗:
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;
}
});
任何想法都赞赏。
答案 0 :(得分:0)
为什么不使用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(","));
}
});