java 由于avro模式异常,使用apache beam ParquetIO从parquet文件读取数据时出错

rsl1atfo  于 2023-02-21  发布在  Java
关注(0)|答案(1)|浏览(99)

我正在使用Apache Beam www.example.com(schema)方法从parquet文件读取数据。执行读取时,我收到以下错误:ParquetIO.readcom. namespace. myfield字段为空。 java.lang.NullPointerException: null of com.namespace.myfield field myfield.
发生这种情况是因为源数据中有问题的字段有一个空值。我更新了www.example.com(schema)方法使用的avro schema,以包含一个union,使其看起来如下所示:ParquetIO.read(schema) method to include a union so that it now looks like the below:

{
   "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.未解决的联盟异常:未结合["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和fixed类型联合的avro模式读取文件的经验?
作为参考,我使用的是2.19.0版本的beam-sdks-java-io-parquet,我相信这反过来又使用了org.apache.avro的v 1.8.2。我不确定发生这种情况是因为在使用的旧版本中存在已知的bug,还是因为我在模式格式中遗漏了一些东西?

    • UPDATE**现在看起来好像发生了错误,因为查找正在按名称"myfield"搜索联合体中的固定字段,但看起来只能使用其fqdn "com. namespace. myfield"找到它。我不完全确定要更改什么,以便它搜索包括名称空间的字段。
atmip9wb

atmip9wb1#

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

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

正在为固定类型调用getIndexNamed方法,此方法中有一个名为indexByName的Map,它包含联合中的元素。上面的代码行正在搜索联合中名为“myfield”的字段。但是,“myfield”不在该Map中,创建时,字段将以全名添加到Map中(包括命名空间),因此它被称为“com.namespace. myfield”。因此,它永远无法解析。
如果我从记录中删除名称空间,它就能够毫无问题地解析联合。

相关问题