[英]How to consume JSON records from Kafka using Spark Streaming and Python?
我用JSON格式的記錄創建了一個Kafka主題。
我可以使用kafka-console-consumer.sh
來使用這些JSON字符串:
./kafka-console-consumer.sh --new-consumer \
--topic test \
--from-beginning \
--bootstrap-server host:9092 \
--consumer.config /root/client.properties
如何在Python中使用Spark Streaming做到這一點?
h,為什么Python不支持Scala? 然后,您的家庭練習將是將以下代碼重寫為Python,然后;-)
來自高級資源 :
從Spark 2.1.1開始,在這些來源中,Python API中提供了Kafka,Kinesis和Flume。
基本上,該過程是:
使用Spark spark-streaming-kafka-0-10_2.11
庫(如Spark Streaming + Kafka集成指南(Kafka代理版本0.10.0或更高版本)中所述)使用KafkaUtils.createDirectStream
閱讀來自Kafka主題的消息 。
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.StringDeserializer
import org.apache.spark.streaming.kafka010._
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
val kafkaParams = Map[String, Object](
"bootstrap.servers" -> "localhost:9092,anotherhost:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[StringDeserializer],
"group.id" -> "use_a_separate_group_id_for_each_stream",
"auto.offset.reset" -> "latest",
"enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics = Array("topicA", "topicB")
val stream = KafkaUtils.createDirectStream[String, String](
streamingContext,
PreferConsistent,
Subscribe[String, String](topics, kafkaParams)
)
使用map
運算符將ConsumerRecords復制到值,這樣您就不會遇到序列化問題。
stream.map(record => (record.key, record.value))
如果您不發送密鑰,那么僅record.value
就足夠了。
stream.map(record => record.value)
將字符串消息轉換為JSON一旦有了值,就可以使用from_json函數:
from_json(e:列,架構:StructType)將包含JSON字符串的列解析為具有指定架構的
StructType
。 如果是不可解析的字符串,則返回null
。
該代碼將如下所示:
...foreach { rdd =>
messagesRDD.toDF.
withColumn("json", from_json('value, jsonSchema)).
select("json.*").show(false)
}
完成!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.