【问题标题】:using spark-avro to write dataframe creates topLevelRecord - want to use existing schema使用 spark-avro 编写数据帧创建 topLevelRecord - 想要使用现有模式
【发布时间】:2018-12-18 16:05:45
【问题描述】:

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

这就是它的样子:

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

【问题讨论】:

    标签: java apache-spark record avro


    【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2016-08-20
      • 1970-01-01
      • 2017-12-15
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多