Spark通过行中的键将csv加载到JavaPairRDD中

时间:2016-10-06 17:20:41

标签: java apache-spark

我想将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;
    }
});

任何想法都赞赏。

1 个答案:

答案 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(","));
            }
        });