web-dev-qa-db-ja.com

Java論理型としての8日付のAvro

最新のAvroコンパイラ(1.8.2)は、Java dates logical types for Joda-Time をベースにした実装のソース)を生成します。Avroの構成方法Java 8日時APIを使用したソースを生成するコンパイラ?

16
injecto

現在(avro 1.8.2)、これは不可能です。 Jodaの日付/時刻クラスを生成するようにハードコーディングされています。

現在のmasterブランチはJava 8に切り替わり、追加の 未解決の問題 (with Pull Request )があります) Java.time.*タイプのクラスを生成する機能。

残念ながら、現在masterにあるものについては、どのような種類のリリーススケジュールもわかりません。冒険的な気分なら、パッチを1.8.2に適用できます。理論的にはすべて互換性があるはずです。シリアライズ/デシリアライズ時の基本となる基本型は、依然として整数と長整数型です。

13
Auke

独自の 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());
5
holi-java

Avro 1.9.2を使用すると、たとえば date for LocalDate

    {
      "name": "Transaction",
      "type": "record",
      "fields": [
        {
          "name": "time",
          "type": {
            "type": "int",
            "logicalType": "date"
          }
        },

他のタイプについては 論理タイプ を参照してください。

0
adrhc