我有大约2MB的20k压缩文件来操作spark。我最初的想法是使用wholeTextFiles()
以便我得到文件名 - >内容元组。这很有用,因为我需要保持这种配对(因为处理是基于每个文件完成的,每个文件代表一分钟的收集数据)。但是,每当我需要映射/过滤/等数据并保持此文件名时 - >关联,代码变得丑陋(也许效率不高?)即
Data.map(lambda (x,y) : (x, y.changeSomehow))
数据本身,因此每个文件的内容,作为单独的RDD读取会很好,因为它包含10k的数据行;然而,人们不能拥有rdd rdd(据我所知)。
有没有办法简化这个过程?基本上允许我使用每个文件的内容作为rdd的任何解决方法,因此允许我做rdd.map(lambda x: change(x))
而没有丑陋的文件名跟踪(以及列表推导的使用而不是转换)?
当然,目标是保持分布式方法,不以任何方式抑制它。
处理的最后一步是通过reduce将所有内容聚集在一起。
更多背景:尝试每分钟识别(近处)船舶碰撞,然后绘制路径
答案 0 :(得分:1)
如果您有正常的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可以减少结果