gpt4 book ai didi

google-cloud-platform - 数据流混合整数和长类型

转载 作者:行者123 更新时间:2023-12-03 23:00:37 24 4
gpt4 key购买 nike

在我的 Dataflow 管道中,我正在设置字段 impressions_raw作为 Longcom.google.api.services.bigquery.model.TableRow目的:

enter image description here

在我的管道中,我阅读了 TableRow退出。但不是 Long , 我得到一个 Integer .

enter image description here

但是,如果我明确地将该值设置为 Long值大于 Integer.MAX_VALUE ,例如30亿,然后我得到一个Long !

enter image description here
enter image description here

似乎 Dataflow SDK 正在进行某种类型的检查优化。

那么,如果不进行丑陋的类型检查,应该如何以编程方式处理这个问题? (也许我错过了一些明显的东西)

最佳答案

谢谢你的报告。不幸的是,这个问题是使用 TableRow 的根本问题。 .我们强烈推荐下面的解决方案 1:转换远离 TableRow尽快在您的管道中使用。
TableRow您在其中存储这些值的对象由 Jackson 在 TableRowJsonCoder 内部序列化和反序列化. jackson 完全有你所描述的行为——也就是说,对于这个类:

class MyClass {
Object v;
}

它将使用 v = Long.valueOf(<number>) 序列化一个实例如 {v: 30}{v: 3000000000} .然而,在反序列化时,它将使用表示答案所需的位数来确定对象的类型。见 this SO post .

想到了两种可能的解决方案,强烈推荐解决方案 1:
  • 请勿使用 TableRow作为中间值。换句话说,尽快转换为POJO。发生这种类型混淆的关键原因是 TableRow本质上是一个 Map<String, Object> jackson (或其他编码人员)无法知道您想要一个 Long背部。使用 POJO,类型会很清楚。

    关闭 TableRow 的另一个优点是找到一个高效的编码器,比如,AvroCoder .因为 TableRow s 被编码和解码到/从 JSON,编码既冗长又缓慢——改组 TableRow将是 CPU 和 I/O 密集型的。我希望你会看到 Avro 编码的 POJO 比通过 TableRow 获得更好的性能周围的物体。

    例如,参见 LaneInfo in TrafficMaxLaneFlow .
  • 编写可以处理两者的代码:

    long numberToLong(@Nonnull Number n) {
    return n.longValue();
    }
    long x = numberToLong((Number) row.get("field"));

    Long numberToLong(@Nonnull Number n) {
    if (n instanceof Long) {
    // avoid a copy
    return n;
    }
    return Long.valueOf(n.longValue());
    }
    Long x = numberToLong((Number) row.get("field"));

    如果 n,您可能需要对第二个变体进行额外检查可能是 null .
  • 关于google-cloud-platform - 数据流混合整数和长类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33622227/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com