【问题标题】:Best way to represent a UUID in Avro?在 Avro 中表示 UUID 的最佳方式?
【发布时间】:2013-05-02 13:34:53
【问题描述】:

我很想了解在 Avro 中对一种非常特定类型的数据进行编码的最佳实践:UUID。

【问题讨论】:

    标签: uuid avro


    【解决方案1】:

    这是我的做法:

    {
        "name": "user_id",
        "type": "string",
        "logicalType": "UUID"
    }
    

    在编写 UUID 的 logicalType 时,尚未记录但仍受支持,您可以在此处检查代码并自行验证:https://github.com/apache/avro/blob/branch-1.8/lang/java/avro/src/main/java/org/apache/avro/LogicalTypes.java#L71

    这里是文档:https://avro.apache.org/docs/1.10.0/spec.html#UUID

    【讨论】:

    • 现在在文档中提到了 avro.apache.org/docs/1.10.0/spec.html#UUID
    • 我想,应该是小写的"logicalType": "uuid"。文档的部分说UUID,但随后注释uuidDate 也是如此,它有一个使用 date 的示例。在LogicalTypes.java 中也是小写的。
    【解决方案2】:

    到目前为止,我发现的唯一方法是定义自定义 UUID:

    {
      "namespace" : "your.namespace",
      "type" : "fixed",
      "name" : "UUID",
      "size" : 16
    }
    

    我使用的是 Scala,所以我还在 java.util.UUID 和我的自定义 UUID 之间定义了一个隐式转换,所以使用它并没有那么麻烦。

    【讨论】:

    • 你好马吕斯。您能否发布一个用于转换的小代码示例?
    【解决方案3】:

    我必须创建一个自定义转换器,因为我无法让 UUID logicalType 在我的 1.8 版项目中工作。只需两步——

    1) 如下创建了一个新类 -

    public class UUIDCustomConverter extends CustomEncoding<UUID>  {
    
    
    @Override
    protected void write(Object datum, Encoder out) throws IOException {
    
        out.writeString(((UUID)datum).toString());
    
    }
    
    @Override
    protected UUID read(Object reuse, Decoder in) throws IOException {
    
        return UUID.fromString(in.readString());
    }
    
    }
    

    2) 为 UUID 属性添加以下注解

    //annotation for handling custom converter
    @AvroEncode(using=UUIDCustomConverter.class)
    protected UUID id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多