【发布时间】: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