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的例子,但是我无法让它做我想做的事。
答案 0 :(得分:2)
为什么你想在你的writeToHBase函数期望rdd作为争论时迭代rdd。只需在流程函数中调用writeToHBase(rdd)
即可。
如果你需要从rdd中获取每条记录,你可以调用
def processRecord(record):
print(record)
rdd.foreach(processRecord)
在processRecord函数中,您将获得要处理的单个记录。