8

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

4

3 回答 3

8

这是我一直在做的事情:

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

在编写logicalTypeUUID 时没有记录,但它仍然受支持,您可以在此处检查代码并自行验证: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

于 2018-10-31T13:45:09.807 回答
7

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

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

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

于 2013-10-31T11:21:55.147 回答
2

我必须创建一个自定义转换器,因为我无法让 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;
于 2018-12-09T01:05:44.173 回答