如何转换JavaRDD&lt; <list <string>&gt; to JavaPairRDD <string,string =“”>

时间:2016-07-15 10:05:23

标签: hadoop apache-spark

我打印时有一个JavaRDD,我的数据看起来像这样 [[字符串1,字符串,STRING3],[串,4],[STRING5,String6],[String7,String8,String9]]

每个String又是一个管道分隔的字符串。我可以拆分每个字符串以形成一个键和值。

如何将此RDD转换为JavaPairRDD?

2 个答案:

答案 0 :(得分:1)

假设您在List_0: ["sub10~sub11~sub12","sub20~sub21~sub22","sub30~sub31~sub32"] List_1: ["sub40~sub41~sub42"] 中有这样的数据:

~

|是分隔符。

您希望展开列表并将第一个和第三个子字符串分组,并将JavaPairRDD<String,String>作为每个输入字符串的键,然后将对存储在key: "sub10|sub12" value: "sub10~sub11~sub12" 中:

flatMap

您可以使用mapToPair然后使用rdd.flatMap(new FlatMapFunction<List<String>,String>() { public Iterable<String> call(List<String> li) throws Exception { return li; } }).mapToPair(new PairFunction<String,String,String>() { public Tuple2<String, String> call(String s) throws Exception { String[] ss = s.split("~"); return new Tuple2<String,String>(ss[0] + "|" + ss[2], s); } }); 来实现此目的:

class MyView extends View

答案 1 :(得分:0)

Follow below code snippet for transforming JavaRDD<K> into JavaPairRDD<K,V>

JavaPairRDD<Integer, Sensor> deviceRdd = sensorRdd.mapToPair(new PairFunction<Sensor, Integer, Sensor>() {

            public Tuple2<Integer, Sensor> call(Sensor sensor) throws Exception {
                Tuple2<Integer, Sensor>  tuple = new Tuple2<Integer, Sensor>(Integer.parseInt(sensor.getsId().trim()), sensor);
                return tuple;
            }
        });