为什么 AvroCoder 不是确定性的?

Why isn't the AvroCoder deterministic?

AvroCoder.isDeterministic returns 错误。

为什么 AvroCoder 不是确定性的? Avro 记录不会总是被编码成相同的字节流吗?

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

基于 Avro specification 看来只有数组和映射具有不确定的二进制编码。

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

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

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

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

因此,对于没有数组或映射的任何模式,我认为二进制编码应该是确定性的。所以我认为我们可以通过将 AvroCoder and overriding AvroCoder.isDeterministic 子类化为 return true.

来创建确定性编码器

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

AvroCoder 可以检查正在编码的架构和类型,并确定它何时是确定性的。它是在 GitHub commit #a806df.

中添加的

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