我正在实施一个Spark Structured Streaming作业,我将以JSON格式消费来自Kafka的消息。
def setup_input_stream(kafka_brokers, spark, topic_name):
return spark.readStream.format("kafka") \
.option("kafka.bootstrap.servers", kafka_brokers) \
.option("subscribe", topic_name) \
.load()
然后,我能够以包含JSON有效负载的String形式从Kafka消息中提取value
字段。
deserialized_data = data_stream \
.selectExpr("CAST (value AS STRING) as json") \
.select(f.from_json(f.col("json"), schema=JSON_SCHEMA).alias("schemaless_data")) \
.select("schemaless_data.payload")
一旦我有了这个有效负载列,我就很难找到让Spark自动推断其架构并将其转换为正确的DataFrame
的方法。
我知道我可以对包含我的有效负载模式的StructType
进行硬编码,但由于我想使用这个通用实现来接收来自不同RDBMS表的数据(每个表在其单独的主题中),我不会# 39;我真的想要对每个可能的表的模式进行硬编码。
可以以某种方式推断消息模式吗?