为什么 AvroCoder 不是确定性的?

问题描述 投票:0回答:3

AvroCoder.isDeterministic 返回 false。

为什么 AvroCoder 不是确定性的? Avro 记录不是总是被编码到同一个字节流中吗?

由于 Avro Coder 不是确定性的,Avro 记录不能用作 group by 操作的键。将 Avro 记录变成密钥的最佳方法是什么?我们应该只使用 Avro 记录的 json 表示形式吗?

avro google-cloud-dataflow
3个回答
3
投票

基于 Avro 规范,看起来只有数组和映射具有非确定性二进制编码。

地图看起来像是非确定性编码,原因有两个

  • 未指定元素的顺序
  • 通过指定块中的元素数量或字节数,可以通过两种不同的方式对块进行编码。

数组看起来像是非确定性编码,因为

  • 通过指定块中的元素数量或字节数,可以通过两种不同的方式对块进行编码。

因此,对于任何没有数组或映射的模式,我认为二进制编码应该是确定性的。所以我认为我们可以通过子类化 AvroCoder 并覆盖 AvroCoder.isDeterministic 以返回 true 来创建确定性编码器。

AvroDeterministicCoder是我第一次尝试创建这样的编码器。


1
投票

AvroCoder
可以检查正在编码的模式和类型并决定何时是确定性的。它已添加到 GitHub 提交#a806df

当底层集合是确定性顺序时,它包括对确定性编码数组和映射的支持。


0
投票

从 Schema 生成的 Avro POJO 间接实现 Serialized。

这意味着,即使它是确定性的,它仍然不能用作密钥,例如对于

CoGroupByKey
GroupByKey
,因为 Beam 会直接拒绝任何可序列化类型,因为它是不确定的。

© www.soinside.com 2019 - 2024. All rights reserved.