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流媒体更高效,更容易起诉