Spark如何将RDD [Seq [(String,String)]]转换为RDD [(String,String)]

时间:2016-01-04 16:27:53

标签: scala apache-spark

我有一个Spark RDD [Seq [(String,String)]],它包含几组两个单词。现在我必须将它们保存到这样的HDFS文件中(无论它们在哪个Seq中):

dog cat
cat mouse
mouse milk

有人可以帮我吗?非常感谢< 3

修改: 谢谢你的帮助。这是解决方案

代码

val seqTermTermRDD: RDD[Seq[(String, String)]] = ...
val termTermRDD: RDD[(String, String)] = seqTermTermRDD.flatMap(identity)
val combinedTermsRDD: RDD[String] = termTermRDD.map{ case(term1, term2) => term1 + " " + term2 }
combinedTermsRDD.saveAsTextFile(outputFile)

2 个答案:

答案 0 :(得分:0)

RDDs有一个称为“flatMap”的简洁功能,可以完全按照你的意愿行事。可以把它想象成Map,然后是Flatten(除了更智能地实现) - 如果函数产生多个实体,则每个实体将分别添加到组中。 (您也可以将此用于Scala中的许多其他对象。)

val seqRDD = sc.parallelize(Seq(Seq(("dog","cat"),("cat","mouse"),("mouse","milk"))),1)
val tupleRDD = seqRDD.flatMap(identity)
tupleRDD.collect  //Array((dog,cat), (cat,mouse), (mouse,milk))

请注意,我还使用了scala功能identity,因为flatMap正在寻找一个将RDD类型的对象转换为TraversableOnce的函数,Seq计为。div

答案 1 :(得分:0)

您还可以在Scala集合中使用mkString( sep )函数(其中sep用于分隔符)。以下是一些示例:(请注意,在您的代码中,您将使用.collect().mkString("\n")替换最后一个saveAsTextFile(filepath))以保存到Hadoop。

scala> val rdd = sc.parallelize(Seq(  Seq(("a", "b"), ("c", "d")),  Seq( ("1", "2"), ("3", "4") )      ))
rdd: org.apache.spark.rdd.RDD[Seq[(String, String)]] = ParallelCollectionRDD[6102] at parallelize at <console>:71

scala> rdd.map( _.mkString("\n")) .collect().mkString("\n")
res307: String = 
(a,b)
(c,d)
(1,2)
(3,4)

scala> rdd.map( _.mkString("|")) .collect().mkString("\n")
res308: String = 
(a,b)|(c,d)
(1,2)|(3,4)

scala> rdd.map( _.mkString("\n")).map(_.replace("(", "").replace(")", "").replace(",", " ")) .collect().mkString("\n")
res309: String = 
a b
c d
1 2
3 4
相关问题