【问题标题】:Handle nested Avro record when the one is null当一个为空时处理嵌套的 Avro 记录
【发布时间】:2018-03-28 06:56:58
【问题描述】:

我有一个关于嵌套 Avro 记录的问题。 实际上,我将 Json 文件转换为 Avro 文件。

使用 Jackson 解析 Json 文件。

事情是这样的:

  • Avro 架构包含 Json 可能包含的所有可能字段(包括嵌套字段),有时缺少一个或多个嵌套 Json。

  • Jackson解析Json文件时,如果缺少嵌套的Json,则对应的jackson对象的引用为null。

  • 当我尝试创建 Avro 记录时,我遇到了一个异常,因为无法从空引用创建嵌套的 Avro 记录。

我的问题如下:如何处理空嵌套记录?我对字段使用默认值,是否有类似的记录?如果没有,除了手动创建嵌套的Json如果不存在(空值),还有其他方法处理吗?

BRgds, 艾迪。

【问题讨论】:

标签: java jackson nested record avro


【解决方案1】:

我发现了问题,和我之前解释的没什么关系,我的坏^^!

其实 Avro 中存在一种 bug ... 简而言之,我填充了使用 builder 创建的嵌套 avro 记录并设置了所有字段:

deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();
deviceInfoBuilder.setModelName(mobtabJsonHit.getMobtabJsonDeviceInfo().getModuleName());
deviceInfoBuilder.setOperatingSystemName(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemName());
deviceInfoBuilder.setOperatingSystemVersion(mobtabJsonHit.getMobtabJsonDeviceInfo().getOperatingSystemVersion());
deviceInfoBuilder.setType(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceType());
deviceInfoBuilder.setAdId(mobtabJsonHit.getMobtabJsonDeviceInfo().getDeviceAdId());

当信息不可用时(即嵌套的 Jackson 不存在),我创建了一个“空”的嵌套 Avro 记录并将其提供给构建器,如下所示:

private final static MobtabAvroDeviceInfo emptyMobtabAvroDeviceInfo =
new MobtabAvroDeviceInfo(null, null, null, null, null);
deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder(emptyMobtabAvroDeviceInfo);

然后,我得到了以下异常:

java.lang.NullPointerException: null of string of fr.mediametrie.internet.pame.meter.avro.MobtabAvroDeviceInfo of fr.mediametrie.internet.pame.meter.avro.MobtabAvroHit

虽然我的 Avro 架构启用了“空”值...

{
    "name": "device_info",
    "type": {
        "type": "record",
        "name": "MobtabAvroDeviceInfo",
        "fields": [
            {
                "name": "model_name",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "operating_system_name",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "operating_system_version",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "type",
                "type": ["null", "string"],
                "default": null
            },
            {
                "name": "ad_id",
                "type": ["null", "string"],
                "default": null
            }
        ]
    }
}

为了解决这个问题,我刚刚创建了一个新的构建器,没有在参数中指定一个“空”的嵌套 Avro 记录:

deviceInfoBuilder = MobtabAvroDeviceInfo.newBuilder();

总而言之,似乎我无法使用默认值创建“空”嵌套 Avro 并向构建器提供,但我必须让构建器使用架构中指定的默认值构建该对象。奇怪,但它现在可以工作了:)

【讨论】:

    【解决方案2】:

    我终于发现了问题... 我有两个不同的模式(我只在这篇文章中发布了一个),都包含一个名为 mobile_web_event 的子记录...... 在生成 avro 源时,子记录 B 删除了 A,并且由于第二个具有不同的默认值,我认为 avro 源生成中存在错误 ...^^!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2020-07-03
      • 2021-11-26
      相关资源
      最近更新 更多