[英]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.