我写了一个Spark程序,它接受了一些输入,对数据做了各种各样的事情,在我处理结束时我有一个
val processedData = ...
processedData的类型为RDD [(Key,List [Data])],其中Key和Data是我定义的案例类。
然后我打电话给processedData.saveAsTextFile(location)
在该位置是一个包含成功文件和54个部分文件的文件夹,我希望看到这些文件。
现在,在另一个程序中,我刚开始编写对输出进行一些统计分析,我从:
开始val groupedData = sc.textFile(location).cache()
但是,我的IDE(理所当然地)认为groupsData的类型为RDD [String]
告诉编译器/ IDE分组数据类型为RDD [(Key,List [Data])]的惯用方法是什么?
答案 0 :(得分:4)
回放:
scala> sc.parallelize(List(1,2,3).zip(List("abc","def","ghi")))
res0: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[0] at parallelize at <console>:22
scala> res0.collect
res1: Array[(Int, String)] = Array((1,abc), (2,def), (3,ghi))
scala> res0.saveAsTextFile("file")
scala> sc.textFile("file")
res3: org.apache.spark.rdd.RDD[String] = file MapPartitionsRDD[3] at textFile at <console>:22
scala> res3.collect
res4: Array[String] = Array((1,abc), (2,def), (3,ghi))
结果是toString方法表示的简单字符串。文档:
def saveAsTextFile(path:String):Unit
将此RDD保存为文本文件,元素的字符串表示。
如何解决:
scala> res0.saveAsObjectFile("file1")
scala> sc.objectFile[(Int,String)]("file1")
res9: org.apache.spark.rdd.RDD[(Int, String)] = MapPartitionsRDD[11] at objectFile at <console>:22
scala> res9.collect
res10: Array[(Int, String)] = Array((1,abc), (2,def), (3,ghi))
文档:
def saveAsObjectFile(path:String):Unit
将此RDD保存为序列化对象。
注意,从文件读取时必须指定类型参数。反序列化是必要的。 Spark想要知道要撤回什么。