在运行时获取Spark(DataFrame)架构(来自Avro架构)

时间:2017-05-26 11:11:27

标签: apache-spark pyspark spark-dataframe avro

我的用例是使用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处理之前)没有意义。

有没有(有效的)方法来实现这个目标?

0 个答案:

没有答案