首页 > 解决方案 > 使用 spark-avro 编写数据帧创建 topLevelRecord - 想要使用现有模式

问题描述

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

这是它的样子:

{
    "type":"record",
    "name":"topLevelRecord",
    "fields":[
         {
            "name":"value",
            "type":["bytes","null"]
         }
    ]
} 

标签: javaapache-sparkrecordavro

解决方案


Avro Schema中需要name 字段( https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-AvroOptions.html

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

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

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")

推荐阅读