我正在使用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"找到它。我不完全确定要更改什么,以便它搜索包括名称空间的字段。
1条答案
按热度按时间atmip9wb1#
因此,我为任何可能遇到相同问题的人想出了这个办法。ParquetIO.read()在apache beam中使用org.apache.avro.generic。在解析联合时,resolveUnion方法的GenericData类中有一行代码:
正在为固定类型调用getIndexNamed方法,此方法中有一个名为indexByName的Map,它包含联合中的元素。上面的代码行正在搜索联合中名为“myfield”的字段。但是,“myfield”不在该Map中,创建时,字段将以全名添加到Map中(包括命名空间),因此它被称为“com.namespace. myfield”。因此,它永远无法解析。
如果我从记录中删除名称空间,它就能够毫无问题地解析联合。