最新のAvroコンパイラ(1.8.2)は、Java dates logical types for Joda-Time をベースにした実装のソース)を生成します。Avroの構成方法Java 8日時APIを使用したソースを生成するコンパイラ?
現在(avro 1.8.2)、これは不可能です。 Jodaの日付/時刻クラスを生成するようにハードコーディングされています。
現在のmaster
ブランチはJava 8に切り替わり、追加の 未解決の問題 (with Pull Request )があります) Java.time.*
タイプのクラスを生成する機能。
残念ながら、現在master
にあるものについては、どのような種類のリリーススケジュールもわかりません。冒険的な気分なら、パッチを1.8.2
に適用できます。理論的にはすべて互換性があるはずです。シリアライズ/デシリアライズ時の基本となる基本型は、依然として整数と長整数型です。
独自の Conversion sを作成して、Java-8日時APIをサポートする必要があります。以下はJava.time.LocalDate
の変換です。
class Java8LocalDateConversion extends Conversion<LocalDate> {
@Override
public Class<LocalDate> getConvertedType() {
return LocalDate.class;
}
@Override
public String getLogicalTypeName() {
// v--- reuse the logical type `date`
return "date";
}
@Override
// convert LocalDate to Integer
public Integer toInt(LocalDate value, Schema schema, LogicalType type) {
return (int) value.toEpochDay();
}
@Override
// parse LocalDate from Integer
public LocalDate fromInt(Integer value, Schema schema, LogicalType type) {
return LocalDate.ofEpochDay(value);
}
}
論理型はavroで再利用できるため、既存のdate
論理型を使用できます。次に例を示します。
Schema schema = LogicalTypes.date().addToSchema(Schema.create(Type.INT));
シリアライズとデシリアライズの場合、独自の変換を見つけるGenericData
を設定する必要があります。次に例を示します。
//serializing
DatumWriter<T> out = new SpecificDatumWriter<>(schema, data());
// deserializing
DatumReader<T> in = new SpecificDatumReader<>(schema, schema, data());
private SpecificData data() {
SpecificData it = new SpecificData();
it.addLogicalTypeConversion(new Java8LocalDateConversion());
return it;
}
毎回GenericData
を設定したくない場合は、代わりにグローバルGenericData
を使用できます。次に例を示します。
// register the conversion globally ---v
SpecificData.get().addLogicalTypeConversion(new Java8LocalDateConversion());