我的用例是使用Avro消息(通过Kafka)并处理它们。不同的种消息有不同的主题。为了解释Avro架构演变,我无法向createDataFrame
方法提供静态Spark架构(从Avro架构派生)。这就是当前代码结构的样子
def avro_decoder(value):
avro_schema_id, message = serializer.decode_message(value)
return avro_schema_id, message
def process_rdd(time, rdd, **schema**):
if rdd.isEmpty():
return
df = spark_session.createDataFrame(
rdd.map(lambda (k, (avro_schema_id, event): event),
**schema**)
kafka_dstream = KafkaUtils.createStream(streaming_context,
zkQuorum,
"spark-streaming-consumer",
{topic: 1},
valueDecoder=avro_decoder)
kafka_dstream.foreachRDD(
lambda time, rdd: write_parquet_file(time, rdd,
**spark_schema**))
我想摆脱方法schema
的(硬编码)process_rdd
参数。由于我有avro_schema_id
提供消息,我应该能够将其转换为spark struct schema并在createDataFrame
方法中使用它。但问题是,正如您所猜测的那样,avro_schema_id
位于RDD内部且没有计算RDD,因此无法使用其值。计算整个RDD(在实际DataFrame处理之前)没有意义。
有没有(有效的)方法来实现这个目标?