作为my previous question的后续内容,如何在本地映射RDD,即将数据收集到本地流中而不实际使用collect
(因为数据太大)
具体来说,我想写一些类似
的内容from subprocess import Popen, PIPE
with open('out','w') as out:
with open('err','w') as err:
myproc = Popen([.....],stdin=PIPE,stdout=out,stderr=err)
myrdd.iterate_locally(lambda x: myproc.stdin.write(x+'\n'))
如何实施此iterate_locally
?
NOT 工作:collect
返回值太大了:
myrdd.collect().foreach(lambda x: myproc.stdin.write(x+'\n'))
NOT 工作:foreach
以分布式模式执行其参数, NOT 本地
myrdd.foreach(lambda x: myproc.stdin.write(x+'\n'))
相关:
答案 0 :(得分:1)
SELECT tx.ID,XMLQUERY('for $e in $d/Client/Address return data($e)' passing tx.contactinfo as "d") FROM clients tx %
怎么样?您可以批量处理数据,如下所示:
RDD.foreachPartition
如果您查看feature request history,则创建myRdd.foreachPartition(it => it.collect.foreach(...))
以跨越这个中间地带。
答案 1 :(得分:1)
您最好的选择是将数据保存到本地计算机可以访问的来源,然后对其进行迭代。
如果这不是一个选项,并假设您的本地计算机一次可以处理一个分区的数据,您是否可以选择性地一次带回一个分区(我先缓存数据)然后再做类似的东西:
rdd.cache()
for partition in range(0, rdd.numPartitions):
data = rdd.mapPartitionsWithIndex(lambda index, itr: [(index, list(itr))]
localData = data.filter(lambda x: x[0] == partition).collect
# Do worker here