2014-09-26 53 views
0

如何将RDD[String]Array[String]转换为字符串?如何连接RDD [String]与Array [String]来生成String?

我得到下面的错误,

<console>:34: error: type mismatch; 
found : org.apache.spark.rdd.RDD[String] 
required: String 

的想法是让某列的不同日期SchemaRDD和CONCAT与常量字符串为/home/tmp/date=日期。所以,我应该Concat的两个输出应该是

val path = /home/tmp/date=20140901,/home/tmp/date=20140902,/home/tmp/date=20140903,/home/tmp/date=20140904,... so on 

路径将在sc.textFiles(path)用键读取整个数据集。

在这一步,当读取数据时,我得到转换错误。

回答

3

黑尔的一种方法。首先,设置了例如:

val prefix = "/home/tmp/date=" 
val dates = Array("20140901", "20140902", "20140903", "20140904") 
val datesRDD = sc.parallelize(dates, 2) 

荏苒的前缀中容易:

val datesWithPrefixRDD = datesRDD.map(s => prefix + s) 
datesWithPrefixRDD.foreach(println) 

这将产生:

/home/tmp/date=20140901 
/home/tmp/date=20140903 
/home/tmp/date=20140902 
/home/tmp/date=20140904 

但是,你问一个字符串。最明显的第一次尝试有一定的逗号问题:

val bad = datesWithPrefixRDD.fold("")((s1, s2) => s1 + ", " + s2) 
println(bad) 

这将产生:

, , /home/tmp/date=20140901, /home/tmp/date=20140902, , /home/tmp/date=20140903, /home/tmp/date=20140904 

的问题是这样的星火RDD的倍()方法启动级联用我提供的空字符串,曾经为整个RDD和每个分区一次。但是,我们可以处理空字符串:

val good = datesWithPrefixRDD.fold("")((s1, s2) => 
    s1 match { 
    case "" => s2 
    case s => s + ", " + s2 
    }) 
println(good) 

然后我们得到:

/home/tmp/date=20140901, /home/tmp/date=20140902, /home/tmp/date=20140903, /home/tmp/date=20140904 

编辑:其实,降低()产生一个整洁的答案,因为它解决了“额外的逗号”的问题:

val alternative = datesWithPrefixRDD.reduce((s1, s2) => s1 + ", " + s2) 
println(alternative) 

我们再次得到:

/home/tmp/date=20140901, /home/tmp/date=20140902, /home/tmp/date=20140903, /home/tmp/date=20140904 
+0

它的工作原理,非常感谢! – 2014-09-27 21:11:32

相关问题