Dataframe 如何使用用户定义的函数在spark中解析json?

Dataframe 如何使用用户定义的函数在spark中解析json?,dataframe,apache-spark,apache-kafka,hive,rdd,Dataframe,Apache Spark,Apache Kafka,Hive,Rdd,我正在做一个项目,包括卡夫卡,火花和蜂巢。我有一个这样的事件示例 {"event": "OrderEvent", "messageid": "2db62eb5-de95-4ce8-8161-ab7552dc2fd7", "userid": "user-346", "lineitems": [{"productid": "prod

我正在做一个项目,包括卡夫卡,火花和蜂巢。我有一个这样的事件示例

{"event": "OrderEvent", "messageid": "2db62eb5-de95-4ce8-8161-ab7552dc2fd7", "userid": "user-346", "lineitems": [{"productid": "product-784", "quantity": 3}, {"productid": "product-173", "quantity": 1}], "orderid": 50000}
有一个消费者作业,订阅卡夫卡主题并消费事件,然后将它们写入hdfs(我的配置单元表的位置)

我的问题是,我想编写一个函数,将json事件解析为每行的字符串,但我得到了
AttributeError:“非类型”对象没有属性“重新分区”

我的整个消费者工作就像

from pyspark import SparkContext, SparkConf
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql import SQLContext
import json


class OrderEventConsumer:

def __init__(self):
    conf = SparkConf().setAppName('OrderEventConsumer')
    self.sc = SparkContext().getOrCreate(conf)
    self.sc.setLogLevel('ERROR')
    self.ssc = StreamingContext(self.sc, 5)
    self.ssc.checkpoint('/tmp/SparkCheckpoints')
    sqlContext = SQLContext(self.sc)

    # Kafka variables
    self.zkQuorum = 'localhost:2189'
    self.topic = 'test'  # 'prod-raw-product-view'

def format_event(self, rdd):
    for i in range(len(rdd['lineitems'])):
        yield '{},{},{},{},{},{}'.format(rdd['userid'], rdd['orderid'], rdd['lineitems'][i]['productid'],
                                         rdd['lineitems'][i]['quantity'], rdd['messageid'], rdd['event_time'])

def consume(self):
    kvs = KafkaUtils.createStream(self.ssc, self.zkQuorum, 'spark-streaming-consumer', {self.topic: 1})
    aRdd = kvs.map(lambda x: json.loads(x[1])) \
        .foreachRDD(lambda x: x.foreach(lambda x: self.format_event(x))) \
        .repartition(1) \
        .saveAsTextFiles('hdfs://node1/user/hive/warehouse/hb.db/fact_order/')
    self.ssc.start()
    self.ssc.awaitTermination()


if __name__ == '__main__':
    orderConsumer = OrderEventConsumer()
    orderConsumer.consume()
我想向hdfs写入一个文件,其中包含每个事件的行项目计数时间行。 我该怎么办


谢谢。

您不应该使用
foreachRDD
foreach
函数-它们不会返回任何数据。如果您想格式化您的东西,只需像前一行一样使用
map

另外,不要使用
重新分区
,而是使用
合并
——它可能会快得多

另外,如果你刚刚开始,我建议你使用Spark结构化流媒体——它可能比Spark流媒体更高效,更容易起诉