在Avro中表示UUID的最佳方式?

时间:2013-05-02 13:34:54

标签: uuid avro

我很想了解在Avro中编码一种非常特殊类型的数据的最佳做法:UUID。

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

我必须创建一个自定义转换器,因为无法在版本1.8的项目中使用UUID logicalType。仅采取了2个步骤-

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;

答案 2 :(得分:0)

这是我一直在做的事情:

{
    "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.8.2/spec.html