将RDD列表转换为spark中单个元素的RDD

时间:2016-08-16 22:50:48

标签: java apache-spark

我有一个输入rdd(JavaRDD<String>),我希望将其转换为JavaRDD<List<String>> input; //suppose rdd length is 2 input.saveAsTextFile(...) 作为输出。
输入RDD列表的每个元素应该成为输出rdd中的单个元素。

如何在java中实现它?

C:\Android\android-ndk

输出:

  

[a,b]
[c,d]

我想要的是什么:

  

a
b
c
d

4 个答案:

答案 0 :(得分:0)

将其转换为DataFrame并使用Explode UDF函数。

答案 1 :(得分:0)

我使用下面的代码片段做了一个解决方法:

使用分隔符'\n' Concat列表的每个元素,然后使用标准spark API保存rdd。

inputRdd.map(new Function<List<String>, String>() {
           @Override
           public String call(List<String> scores) throws Exception {
               int size = scores.size();
               StringBuffer sb = new StringBuffer();
               for (int i=0; i <size;i++){
                   sb.append(scores.get(i));
                   if(i!=size-1){
                        sb.append("\n");
                    }
               }
               return sb.toString();
           }
       }).saveAsTextFile("/tmp/data"));

答案 2 :(得分:0)

如果rdd类型为RDD[List[String]],您可以这样做:

val newrdd = rdd.flatmap(line => line)

每个元素都是新rdd中的新行。

答案 3 :(得分:-1)

下面的

将解决您的问题

 var conf = new SparkConf().setAppName("test")
            .setMaster("local[1]")
            .setExecutorEnv("executor-cores", "2")
 var sc = new SparkContext(conf)
 val a = sc.parallelize(Array(List("a", "b"), List("c", "d")))  
 a.flatMap(x => x).foreach(println)

输出

  

一个
  b
  c
  d