2013-06-28 2 views
2

HBase에 값으로 저장하는 복잡한 Avro 레코드 (중첩 레코드, 유니온 타입)가 있습니다. 같은 rowkey을 가진 레코드가 이미 존재하는지 그때 HBase를을 확인Java의 HBase에서 Avro 레코드 읽기

Schema schema = new Schema.Parser().parse(schema_file); 
DatumReader<GenericRecord> datumReader = new SpecificDatumReader<GenericRecord>(schema); 
DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(avro_file, datumReader); 
GenericRecord record = null; 
record = dataFileReader.next(record); 

: 저는 현재 파일의 작가 스키마와 일치하는 스키마 및 HBase와에있는 레코드를 사용하여 아 브로 데이터 파일에 읽습니다. 이 경우

if (val == null) { 
    System.out.println("pk: "+pk+" does not exist"); 
    Put put = new Put(Bytes.toBytes(pk)); 
    put.add(Bytes.toBytes("c"), Bytes.toBytes("c"), Bytes.toBytes(record.toString())); 
    try { 
    table.put(put); 
    } catch (Exception e) { 
    System.err.println("Can't put to table: " + e); 
    } 
} 
else { 
    System.out.println("pk: "+pk+" does exist"); 
    //help me! 
} 

: 더 레코드가 같은 rowkey과 HBase를 거기에 없다면

Configuration conf = HBaseConfiguration.create(); 
HTable table = new HTable(conf, "table"); 
String pk = new String(record.get("x").toString()+record.get("y").toString()); 
Get get = new Get(Bytes.toBytes(pk)); 
Result result = table.get(get); 
byte[] val = result.getValue(Bytes.toBytes("c"),Bytes.toBytes("c")); 

, 나는에 기록을 넣어 내 GET에 의해 반환 된 발은 브로 레코드의 바이트 배열 표현입니다 동일한 rowkey를 가진 HBase의 레코드, HBase 결과의 바이트 배열을 Avro 스키마로 다시 변환 한 다음 두 필드를 비교하여 어떤 레코드가 '더 나은'것인지 확인합니다. HBase에 '더 나은'레코드를 넣고 싶습니다.하지만 막혔습니다. HBase의 바이트 배열을 GenericRecord로 변환하여 파일 레코드와 HBase 사이의 필드를 비교할 수 있습니까?

답변

4

나는 그것을 알아 냈다. HBase에 레코드를 바이트 배열로 변환 된 문자열 대신 직렬화 된 바이트 배열로 써야했습니다.

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema); 
DataFileWriter<GenericRecord> dfw = new DataFileWriter<GenericRecord>(writer); 
dfw.create(schema, baos); 
dfw.append(record); 
dfw.close(); 
Put put = new Put(Bytes.toBytes(pk)); 
put.add(Bytes.toBytes("c"), Bytes.toBytes("c"), baos.toByteArray()); 

을 그리고이 얻을 :

풋이된다

GenericRecord hrecord = null; 
    ByteArrayInputStream bais = new ByteArrayInputStream(val); 
    DataFileStream<GenericRecord> dfs = new DataFileStream<GenericRecord>(bais, datumReader); 
    hrecord = dfs.next(hrecord); 
관련 문제