使用spark-avro编写数据框创建topLevelRecord-要使用现有架构

时间:2018-07-10 17:58:17

标签: java apache-spark record avro

我正在使用Kryo编码器将GenericRecords编码为spark DataFrame,并且正在将数据帧写入Avro文件。尝试从Hive读取文件后,我收到一条错误消息,提示解析器找到了toplevelrecord而不是期望的字段。该记录不在我现有的架构中,我认为当我使用spark-avro编写时会创建它。我想知道是否/如何将其从avro文件中删除。

它是这样的:

0.0.0.0

1 个答案:

答案 0 :(得分:1)

在Avro架构(https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-AvroOptions.html)中必填

如果未在架构中设置值,则默认值 topLevelRecord 是默认值,但是您可以在写入数据框时提供一个值来覆盖它。

斯卡拉: 创建一个参数映射并将其传递给编写器:

val name = "AvroTest"
val parameters = Map("recordName" -> name)
df.write.options(parameters).format("avro").save("/tmp/output")

参考:https://docs.databricks.com/spark/latest/data-sources/read-avro.html

Python: 将选项传递给编写器,如下所示:

df.write.format("com.databricks.spark.avro").option("recordName", "Uber").save("tmp/output")