簡體   English   中英

Spark通過在行中找到的鍵將csv加載到JavaPairRDD中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM