AvroParquetOutputFormat - 无法写入包含空元素的数组

AvroParquetOutputFormat - Unable to Write Arrays with Null Elements

我正在使用 parquet-mr 库的 v1.11.1 作为 Java 应用程序的一部分 Avro 使用 AvroParquetOutputFormat 记录并将它们写入 Parquet 文件。有 具有数组类型字段的 Avro 记录将包含空元素,例如

[ "Foo", "Bar", null, "Baz"].

这是一个 Avro 架构示例:

{
  "type": "record",
  "name": "NullLists",
  "namespace": "com.test",
  "fields": [
    {
      "name": "KeyID",
      "type": "string"
    },
    {
      "name": "NullableList",
      "type": [
        "null",
        {
            "type": "array",
            "items": [
                "null",
                "string"
            ]
        }
      ],
      "default": null
    }
  ]
}

我正在尝试写入以下记录:

{
  "KeyID": "0",
  "NullableList": [
    "foo",
    null,
    "baz"
  ]
}

我以为我可以使用 3 级列表编写器来支持这一点,但是,它导致 以下异常:

Caused by: java.lang.ClassCastException: repeated binary array (STRING) is not a group
        at org.apache.parquet.schema.Type.asGroupType(Type.java:250)
        at org.apache.parquet.avro.AvroWriteSupport$ThreeLevelListWriter.writeCollection(AvroWriteSupport.java:612)
        at org.apache.parquet.avro.AvroWriteSupport$ListWriter.writeList(AvroWriteSupport.java:397)
        at org.apache.parquet.avro.AvroWriteSupport.writeValueWithoutConversion(AvroWriteSupport.java:355)
        at org.apache.parquet.avro.AvroWriteSupport.writeValue(AvroWriteSupport.java:278)
        at org.apache.parquet.avro.AvroWriteSupport.writeRecordFields(AvroWriteSupport.java:191)
        at org.apache.parquet.avro.AvroWriteSupport.write(AvroWriteSupport.java:165)
        at org.apache.parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:128)

支持这种记录吗?我也试过 parquet.avro.add-list-element-records 选项也设置为 false,运气不好。

编辑:我已经创建了一个 Parquet JIRA 来跟踪这个问题。

对于那些感兴趣的人 - 这需要一个补丁,它 was merged to master here. Corresponding JIRA