2017-02-09 3 views
0

AVROを初めて使用しています。私たちはAVROスキーマを使ってデータを読み始めました。AVROを使用しているフィールドのデータ変換

ここでは、読んでいる間にデータを切り捨てる必要があるユースケースがあります。

は私のアブロschcema今すぐデータがこのようなものです。この

{ 
    "name": "table", 
    "namepsace": "csd", 
    "type": "record", 
    "fields": [ 
     {"name": "CustId", "type":"string"}, 
     {"name": "ProductId", "type":"string"}, 
     {"time": "time", "type":"long"} 
    ] 
} 

のようなものであると仮定します。

{ 
    "CustId" : "abc1234" 
    "ProductID" : "ABC1234567" 
    "time" : 123456789 
} 

私がデータを読むと、フィールドProductIDが切り捨てられます。 上記の例でABC1234567のProductIDを読んだとき、5文字に切り捨てたいと思います。ABC12

切り捨てるには何も指定できますか?

答えて

0

これは可能なスタートです。 SpecificDatumReaderには、次の変換ロジックが含まれています。変換メソッドをオーバーライドするには、生成されるクラスに依存します。 Schemaコンパイラは、変換オブジェクトを挿入するためにフックを持つ必要があります。私はフックを探していました。

@Override 
protected void readField(Object r, Schema.Field f, Object oldDatum, 
         ResolvingDecoder in, Object state) 
    throws IOException { 
if (r instanceof SpecificRecordBase) { 
    Conversion<?> conversion = ((SpecificRecordBase)).getConversion(f.pos()); 

    Object datum; 
    if (conversion != null) { 
    datum = readWithConversion(
     oldDatum, f.schema(), f.schema().getLogicalType(), conversion, in); 
    } else { 
    datum = readWithoutConversion(oldDatum, f.schema(), in); 
    } 
関連する問題