【问题标题】:Error when using apache beam ParquetIO to read data from parquet file due to avro schema exception由于 avro 模式异常,使用 apache beam ParquetIO 从 parquet 文件读取数据时出错
【发布时间】:2023-02-18 00:04:25
【问题描述】:

我正在使用 Apache Beam ParquetIO.read(schema) 方法从镶木地板文件中读取数据。执行读取时出现以下错误:java.lang.NullPointerException: null of com.namespace.myfield field myfield。

发生这种情况是因为源数据中的相关字段具有空值。我更新了 ParquetIO.read(schema) 方法使用的 avro 模式以包含一个联合,这样它现在看起来如下所示:

{
   "type": "record",
   "name": "TABLE",
   "namespace": "com.namespace",
   "fields": [
      {
         "name": "myfield ",
         "type": [
            "null",
            {
                "type": "fixed",
                "name": "myfield",
                "size": 5,
                "logicalType": "decimal",
                "precision": 10,
                "scale": 5
            }
         ]
      }
}

我的想法是,这将允许该值为 null 或所需的固定类型。

当我现在运行相同的代码时,我得到一个不同的错误:org.apache.avro.UnresolvedUnionException: Not in union ["null",{"type":"fixed","name":"myfield","namespace":"com.namespace","size":5,"logicalType":"decimal","precision":10,"scale":5}]: [0, 0, 0, 0, 0]

当我调试代码并逐步执行时,似乎是从 resolveUnion 方法中的 org.apache.avro.generic.GenericData 类抛出了异常,它看起来好像无法找到所需的固定类型,因为它无法处理数组中的复杂类型。

有没有人有过让 ParquetIO 使用包含 null 联合和固定类型的 avro 模式读取文件的经验?

作为参考,我使用的是 2.19.0 版本的 beam-sdks-java-io-parquet,我相信这反过来使用的是 org.apache.avro 的 v 1.8.2。我不确定是否会发生这种情况,因为正在使用的旧版本中存在已知错误,或者我是否缺少架构格式中的某些内容?

更新现在看起来错误正在发生,因为查找正在按名称“myfield”搜索联合内的固定字段,但看起来它只能通过其 fqdn“com.namespace.myfield”找到。我不完全确定要更改什么以便它搜索包含命名空间的字段。

【问题讨论】:

    标签: java apache-beam avro apache-beam-io


    【解决方案1】:

    因此,我为可能遇到相同问题的任何人解决了这个问题。 apache beam 中的 ParquetIO.read() 使用 org.apache.avro.generic。解析联合时,在 resolveUnion 方法的 GenericData 类中有一行代码:

    Integer i = union.getIndexNamed(getSchemaName(datum));
    

    正在为固定类型调用 getIndexNamed 方法,在此方法中有一个名为 indexByName 的映射,其中包含联合中的元素。上面的那行代码正在搜索联合中名为“myfield”的字段。然而,“myfield”不在该地图中,当它被创建时,该字段被添加到具有全名(包括命名空间)的地图中,因此它被称为“com.namespace.myfield”。因此,它永远无法解决。

    如果我从记录中删除命名空间,它就可以毫无问题地解析联合。

    【讨论】:

      猜你喜欢
      • 2020-01-02
      • 1970-01-01
      • 2018-08-11
      • 2016-03-16
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多