복붙노트

[HADOOP] 리플렉션을 사용하여 pojo의 마루 파일에 쓰기

HADOOP

리플렉션을 사용하여 pojo의 마루 파일에 쓰기

안녕하세요, Pojos와 함께 parquest를 작성하는 API를 찾고 있습니다. 리플렉션을 사용하여 avro 스키마를 생성 한 다음 AvroSchemaConverter를 사용하여 쪽매 스키마를 만들 수있었습니다. 또한 Pojos를 GenericRecords (avro)로 변환하는 방법을 찾을 수 없습니다. 그렇지 않으면 AvroParquetWriter를 사용하여 Pojo를 마루 파일에 쓸 수있었습니다. 어떤 제안?

해결법

  1. ==============================

    1.avro를 통해 이동하려면 다음 두 가지 옵션이 있습니다.

    avro를 통해 이동하려면 다음 두 가지 옵션이 있습니다.

    1) avro가 pojos를 생성하도록하십시오 (여기 튜토리얼 참조). 생성 된 pojos는 SpecificRecord를 확장 한 다음 AvroParquetWriter와 함께 사용할 수 있습니다.

    2) pojo에서 GenericRecord 로의 변환을 직접 작성하십시오. 이 작업은 수동으로 수행하거나보다 일반적인 해결책은 리플렉션을 사용하는 것입니다. 그러나 데이터를 읽으려고 할 때이 접근법에 어려움을 겪었습니다. 제공된 스키마를 기반으로 avro는 classpath에서 pojo를 발견하고 GenericRecord 대신 SpecificRecord를 인스턴스화하려고 시도했습니다. 이런 이유로 나는 옵션 1을 사용했다.

    마루는 또한 지금 pojo를 직접 쓰는 것을 지원합니다. 다음은 마루 기둥 페이지에 대한 요청입니다. 그러나 이것은 아직 공식 릴리스의 일부가 아니라고 생각합니다. 다른 말로하면, 나는이 코드를 maven에서 찾지 못했습니다.

  2. ==============================

    2.면책 조항 : 다음 코드는 내가 서둘렀을 때 작성되었습니다. 그것은 효율적인 것이 아니므로 마루판의 향후 버전은 분명 더 직접이 문제를 해결할 것입니다. 즉, 이것은 당신이 필요로하는 것에 비경상적인 비효율적 접근법입니다. 전략은 POJO -> AVRO -> PARQUET입니다.

    면책 조항 : 다음 코드는 내가 서둘렀을 때 작성되었습니다. 그것은 효율적인 것이 아니므로 마루판의 향후 버전은 분명 더 직접이 문제를 해결할 것입니다. 즉, 이것은 당신이 필요로하는 것에 비경상적인 비효율적 접근법입니다. 전략은 POJO -> AVRO -> PARQUET입니다.

    private static final Schema avroSchema = ReflectData.AllowNull.get().getSchema(YOURCLASS.class);
    private static final ReflectDatumWriter<YOURCLASS> reflectDatumWriter = new ReflectDatumWriter<>(avroSchema);
    private static final GenericDatumReader<Object> genericRecordReader = new GenericDatumReader<>(avroSchema);
    
    public GenericRecord toAvroGenericRecord() throws IOException {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        reflectDatumWriter.write(this, EncoderFactory.get().directBinaryEncoder(bytes, null));
        return (GenericRecord) genericRecordReader.read(null, DecoderFactory.get().binaryDecoder(bytes.toByteArray(), null));
    }
    

    한 가지 더 : 그것은 쪽모 세공 작가는 현재 null 필드에 대해 매우 엄격한 것 같습니다. 마루에 쓰기를 시도하기 전에 필드가 널인지 확인하십시오.

  3. ==============================

    3.기존 솔루션을 찾을 수 없어서 직접 구현했습니다. 다음은 구현 링크입니다. https://gist.github.com/alexeygrigorev/eab72e40c6051e0163a6693054906d66

    기존 솔루션을 찾을 수 없어서 직접 구현했습니다. 다음은 구현 링크입니다. https://gist.github.com/alexeygrigorev/eab72e40c6051e0163a6693054906d66

    즉, 다음과 같은 작업을 수행합니다.

  4. from https://stackoverflow.com/questions/26435299/write-pojos-to-parquet-file-using-reflection by cc-by-sa and MIT license