如何在本地映射RDD?

时间:2015-05-27 16:28:30

标签: apache-spark pyspark

作为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'))

相关:

2 个答案:

答案 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