我很想了解在Avro中编码一种非常特殊类型的数据的最佳做法:UUID。
答案 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