如何在推入kafka主题时将该行格式转换为JSON

时间:2018-08-08 18:01:25

标签: apache-spark pyspark apache-kafka pyspark-sql

我正在使用Spark应用程序来处理放置在系统中/ home / user1 / files /文件夹中的文本文件,并将这些文本文件中出现的逗号分隔数据映射为特定的JSON格式。我已经使用spark编写了以下python代码来执行相同的操作。但是,Kafka中的输出将如下所示

Row(Name=Priyesh,Age=26,MailId=priyeshkaratha@gmail.com,Address=AddressTest,Phone=112)

Python代码:

import findspark
findspark.init('/home/user1/spark')
from pyspark import SparkConf, SparkContext
from operator import add
import sys
from pyspark.streaming import StreamingContext
from pyspark.sql import Column, DataFrame, Row, SparkSession
from pyspark.streaming.kafka import KafkaUtils
import json
from kafka import SimpleProducer, KafkaClient
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='server.kafka:9092')

def handler(message):
	records = message.collect()
	for record in records:
		producer.send('spark.out', str(record))
		print(record)
		producer.flush()

def main():
	sc = SparkContext(appName="PythonStreamingDirectKafkaWordCount")
	ssc = StreamingContext(sc, 1)

	lines = ssc.textFileStream('/home/user1/files/')
	fields = lines.map(lambda l: l.split(",")) 
	udr =  fields.map(lambda p: Row(Name=p[0],Age=int(p[3].split('@')[0]),MailId=p[31],Address=p[29],Phone=p[46]))
	udr.foreachRDD(handler)

	ssc.start()
	ssc.awaitTermination()
if __name__ == "__main__":
	main()

那么当推入kafka主题时,如何将该行格式转换为JSON?

1 个答案:

答案 0 :(得分:1)

您可以将Spark Row对象转换为dict的对象,然后将其序列化为JSON。例如,您可以更改以下行:

producer.send('spark.out', str(record))

对此:

producer.send('spark.out', json.dumps(record.asDict())))

或者,在您的示例代码中,由于您没有使用DataFrames,因此可以将其创建为以dict开头的命令,而不是Row。