我有一个输入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
答案 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