gpt4 book ai didi

java - Avro - 如何为 SpecificCompiler 注册自定义 LogicalType

转载 作者:行者123 更新时间:2023-12-02 11:06:49 32 4
gpt4 key购买 nike

嘿 avro 用户和专家,

我想使用avro逻辑类型,意味着我自己创建一些 - 不仅仅是使用内置的。

问题是如何让编译器从模式生成代码以使用我自己创建的代码

我创建了我的架构(相关部分):

{
"name": "street",
"type": {
"type": "string",
"logicalType": "custom-street"
},
"doc": "Street format ending with house number"
}

(当然还有创建的类型和转换,请参阅 https://github.com/markush81/avro-examples )

我现在不知道如何配置编译器来使用它

我通过 gradle 插件使用编译器(但我想这一开始并没有什么区别)

plugins {
id 'com.commercehub.gradle.plugin.avro' version '0.14.2'
}

avro {
enableDecimalLogicalType = true //enable built-in decimal type
}

感谢您的任何提示(或解决方法)。

P.S.:当然,我知道如何操作生成的类来支持我的逻辑类型(请参阅: https://github.com/markush81/avro-examples/tree/master/src/main/manual ),但这意味着我永远无法从我的架构定义重新编译。

最佳答案

avro code 中进行大量搜索后1.8.2 我得出的结论是,目前编译器工具不支持自定义逻辑类型用于代码生成

如果我们看一下 record.vm 速度模板

#if ($this.hasLogicalTypeField($schema))
protected static final org.apache.avro.data.TimeConversions.DateConversion DATE_CONVERSION = new org.apache.avro.data.TimeConversions.DateConversion();
protected static final org.apache.avro.data.TimeConversions.TimeConversion TIME_CONVERSION = new org.apache.avro.data.TimeConversions.TimeConversion();
protected static final org.apache.avro.data.TimeConversions.TimestampConversion TIMESTAMP_CONVERSION = new org.apache.avro.data.TimeConversions.TimestampConversion();
protected static final org.apache.avro.Conversions.DecimalConversion DECIMAL_CONVERSION = new org.apache.avro.Conversions.DecimalConversion();

private static final org.apache.avro.Conversion<?>[] conversions = new org.apache.avro.Conversion<?>[] {
#foreach ($field in $schema.getFields())
${this.conversionInstance($field.schema())},
#end
null
};

@Override
public org.apache.avro.Conversion<?> getConversion(int field) {
return conversions[field];
}
#end

仅添加了四种转换,这些转换是由 avro 本身提供的。

另一 block 值得一看的是org.apache.avro.compiler.specific.SpecificCompiler

  public String conversionInstance(Schema schema) {
if (schema == null || schema.getLogicalType() == null) {
return "null";
}

if (LogicalTypes.date().equals(schema.getLogicalType())) {
return "DATE_CONVERSION";
} else if (LogicalTypes.timeMillis().equals(schema.getLogicalType())) {
return "TIME_CONVERSION";
} else if (LogicalTypes.timestampMillis().equals(schema.getLogicalType())) {
return "TIMESTAMP_CONVERSION";
} else if (LogicalTypes.Decimal.class.equals(schema.getLogicalType().getClass())) {
return enableDecimalLogicalType ? "DECIMAL_CONVERSION" : "null";
}

return "null";
}

也根本没有可以添加自定义逻辑类型的部分。

关于java - Avro - 如何为 SpecificCompiler 注册自定义 LogicalType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895923/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com