如何重用Spark的计算结果?--遇到的问题--待解决(已解决字符串文件存储的方式)


     word_count 在大数据学习上,就行刚开始编程时候打印“ Hello world ”一样, Spark word_count 的解决实现确实比较优雅,只需要一条语句就解决了:

sc.textFile(filePath).flatMap(line==>line.split(“\\s+”)).map(word==>(word,1)).reduceByKey(_+_)

得到的结果RDD形式是:RDD[String,Int]

我们通过:RDD.saveAsFile(path) 把计算结果保存为文件,得到的文件如下:

如何重用Spark的计算结果?--遇到的问题--待解决(已解决字符串文件存储的方式)

每个文件的内容:

如何重用Spark的计算结果?--遇到的问题--待解决(已解决字符串文件存储的方式)

引深一步思考:

如果我的job每日迭代运算的:

比如第一天的时候,我运行出了结果并存储在目录/result/...了(就像上面的形式,生成了:part_0000part_0001......);

第二天我需要对于今天新增的文件new.txt重新和昨天的结果文件/result/...运算,

 

这类型的需求该如何解决呢?

 

目前我遇到的问题是:

当我抽象为单个part文件和新文件进行计算时候,我遇到了问题:

val new_file  =
sc.textFile("../xx").flatMap(line=>line.split("\\n")).map(word=>(word,1)).reduceByKey(_+_)

val old_file  = sc.textFile("../xx").flatMap(line=>line.split("\\n"))

new_file.union(old_file)//报错

报错的原因是:

new_file这个RDD的数据类型是(StringInt)型,而old_fileRDD是(String)型,类型不匹配导致不能union,所以会提示报错!

解决此问题的方法就是如何从old_file文件读取数据集而且还能转化为RDD(String,Int),这个old_file本身也是(String,Int)型。

目前的需求:如果一次性能把诸如:part_0000part_0001……文件里的内容都自动转化为RDD(String,Int) ,问题就解决了

另一种方式: 

如果把历史计算结果通过saveAsObjectFile("F:\\dir_name")存储为对象呢?

读取的时候通过sc.objectFile("F:\\history\\part-...") 这个方法传入什么样的参数可以讲part文件碎布片都读取出来?

而且读取出来的RDD怎么才能转换为RDD(String,Int) ?

                                                                                      求解,非常感谢!

 ------------------------------------------------------------------------------------------------

解决一:从saveAsFile(path) 生成的结果中提取数据(有点像反序列化)

经过在社区里众人的帮助,其中 无边落木@play2 给出了一种将字符串转化为(String,Int)的方法,实现是:

sc.textFile("F:\\result").flatMap(line=>line.split("\\n")).map(cloumn => { val v = cloumn.replace("(","").replace(")","").split(","); (v(0),v(1).toInt ) })

发现textFile可以出来此目录下的文件分片,程序中的核心是:取到一行,替换后按“,”分割,组成(String,Int)返回出去,就可以了!

非常感谢!

解决二:从saveAsFile(path) 生成的结果中提取数据 -- 待解决




你可能感兴趣的:(如何重用Spark的计算结果?--遇到的问题--待解决(已解决字符串文件存储的方式))