如何将RDD [String]与Array [String]连接起来生成String?

时间:2014-09-26 10:51:10

标签: scala apache-spark apache-spark-sql

如何将RDD[String]Array[String]转换为字符串?

我收到以下错误,

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

我们的想法是从SchemaRDD中的列中获取不同的日期,并使用常量字符串将日期连接为/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)中键入以读取整个数据集。

在此步骤中,在读取数据时,我收到转换错误。

1 个答案:

答案 0 :(得分:3)

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

编辑:实际上,reduce()产生更整洁的答案,因为它解决了额外的逗号&#34;问题:

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