我有约2MB的20k压缩文件,可以在火花中操作。我最初的想法是使用,wholeTextFiles()
以便获取文件名->内容元组。这很有用,因为我需要维护这种配对(因为处理是基于每个文件进行的,每个文件代表一分钟收集的数据)。但是,每当我需要映射/过滤/等数据并维护此文件名->关联时,代码就会变得难看(也许效率不高?),即
Data.map(lambda (x,y) : (x, y.changeSomehow))
数据本身,也就是每个文件的内容,很高兴作为一个单独的RDD读取,因为它包含10k行数据。但是,据我所知,rdd不能是rdds。
有什么办法可以简化这个过程?有什么变通办法基本上可以让我将每个文件的内容用作rdd,从而使我不必rdd.map(lambda x: change(x))
丑陋地跟踪文件名(以及使用列表推导而不是转换)吗?
当然,目标是保持分布式方法,并且不以任何方式禁止它。
处理的最后一步将是通过简化将所有内容收集在一起。
更多背景知识:尝试每分钟识别(附近)船舶碰撞,然后绘制其路径
如果您具有常规map
功能(o1-> o2),则可以使用mapValues函数。您还具有flatMap(o1-> Collection())函数:flatMapValues。
它将保留Key(在您的情况下为-文件名)并仅更改值。
例如:
rdd = sc.wholeTextFiles (...)
# RDD of i.e. one pair, /test/file.txt -> Apache Spark
rddMapped = rdd.mapValues (lambda x: veryImportantDataOf(x))
# result: one pair: /test/file.txt -> Spark
使用reduceByKey可以减少结果
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句