将保存的文本文件从Spark程序读入另一个

时间:2015-07-20 18:43:06

标签: scala apache-spark

我写了一个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])]的惯用方法是什么?

1 个答案:

答案 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想要知道要撤回什么。