如何将RDD[String]
和Array[String]
转换为字符串?
我收到以下错误,
<console>:34: error: type mismatch;
found : org.apache.spark.rdd.RDD[String]
required: String
其想法是从SchemaRDD中的列中获取不同的日期,并将该日期与常量String连接为/home/tmp/date=
。所以我应该同时连接两者,输出应该是
val path = /home/tmp/date=20140901,/home/tmp/date=20140902,/home/tmp/date=20140903,/home/tmp/date=20140904,... so on
路径将在sc.textFiles(path)
中键入以读取整个数据集。
在这个步骤中,在读取数据时,我得到了转换错误。
Hare的一种方法。首先,设置示例:
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
问题是Spark RDD的fold()方法如何用我提供的空字符串开始串联,一次用于整个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
EDIT:实际上,reduce()产生了一个更整洁的答案,因为它解决了"额外逗号"问题:
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