使用foreachRDD和foreach迭代pyspark中的rdd

时间:2016-05-27 21:19:32

标签: python apache-spark pyspark

Spark 1.6.1的问题,pyspark

我的流媒体数据就像

一样
{"event":4,"Userid":12345,"time":123456789,"device_model":"iPhone OS", "some_other_property": "value", "row_key": 555}

我有一个写入HBase的函数,名为writeToHBase(rdd),期望在以下结构中有一个具有元组的rdd:

(rowkey, [rowkey, column-family, key, value])

从输入格式中可以看出,我必须使用原始数据集并遍历所有键,通过发送函数调用发送每个键/值对。

阅读火花流编程指南,“使用foreachRDD的设计模式”部分http://spark.apache.org/docs/latest/streaming-programming-guide.html#tab_python_13

似乎建议在执行数据集外部操作时使用foreachRDD。在我的情况下,我想通过网络将数据写入HBase,因此我在流数据上使用foreachRDD并调用将处理数据发送的函数:

stream.foreachRDD(lambda k: process(k))

我对spark函数的理解现在非常有限,所以我无法找到一种方法来迭代我的原始数据集以使用我的write函数。如果它是python可迭代的,我将能够这样做:

def process(rdd):
    for key, value in my_rdd.iteritems():
        writeToHBase(sc.parallelize(rowkey, [rowkey, 'column-family', key, value]))

其中rowkey是通过在rdd本身找到它来获得的

rdd.map(lambda x: x['rowkey'])

我如何完成pyspark中的进程()?我看到一些使用foreach的例子,但是我无法让它做我想做的事。

1 个答案:

答案 0 :(得分:2)

为什么你想在你的writeToHBase函数期望rdd作为争论时迭代rdd。只需在流程函数中调用writeToHBase(rdd)即可。

如果你需要从rdd中获取每条记录,你可以调用

def processRecord(record):
        print(record)   
rdd.foreach(processRecord)

在processRecord函数中,您将获得要处理的单个记录。