2017-02-09 1 views
0

AVRO를 처음 사용했습니다. 우리는 AVRO 스키마를 사용하여 데이터를 읽었습니다.AVRO를 사용하는 필드에 대한 데이터 변환

이제 우리는 읽는 동안 데이터를자를 필요가있는 사용 사례가 있습니다.

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

이제 데이터가 다음과 같이처럼 내 브로 schcema은 가정하자.

{ 
    "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); 
    } 
관련 문제