我使用的是一个相对较小的pyspark sequenceFile(~8gb)格式:
----------------------
|ID | binary file |
|---------------------
|ABCD | xxxx.... |
|---------------------
|ABC3 | xxxx.... |
----------------------
有大约150,000个条目
我理解mapreduce是一个非常快速的平台,擅长快速搜索数据库并解压缩二进制文件以快速获取文件中的有趣数据。但是,我并不总是希望使用全部文件,有时我对每个计算的一个或两个文件更感兴趣。
那么重复访问hadoop sequenceFile中的特定条目的最佳方法是什么?
RDD.lookup("ID")
(每个参赛作品似乎需要很长时间)
sortByKey
这样的功能似乎非常有帮助。 RDD.filter(xxx)
(一次可以阅读多个,但重新访问的速度仍然很慢)dict(RDD.collect())
(非常快,但需要大量内存+长时间初读)所以......这就是我现在所处的位置。
from pyspark import SparkContext, SparkConf
conf = SparkConf().setMaster("local[*]")
conf = (SparkConf().setAppName("imnotsure")
.set('spark.executor.memory', '4G')
.set('spark.driver.memory', '10G')
.set('spark.driver.maxResultSize', '10G'))
sc = SparkContext(conf=conf)
db = sc.sequenceFile("DIRECTORY OF SEQUENCEFILES")
tofind = ["ABC3"]
while len(tofind) != 0:
db.lookup("ABC3") # Takes a long time
# Do calculations on ABC3
# maybe return "123D", "13BF"
tofind = ["123D", "13BF"]
# Keep going until tofind == []
注意: 我不反对切换格式,也许sequenceFiles不是可行的方式。但是,大小很好,这就是我们提供数据的方式。