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