복붙노트

[HADOOP] 어떻게 org.apache.parquet.hadoop.ParquetWriter를 사용하여 마루에 NULL 값을 기록 할 수 있습니까?

HADOOP

어떻게 org.apache.parquet.hadoop.ParquetWriter를 사용하여 마루에 NULL 값을 기록 할 수 있습니까?

나는 데이터 파일을 마루에 CSV 데이터 파일을 변환하는 org.apache.parquet.hadoop.ParquetWriter을 사용하는 도구가 있습니다.

나는 기본 기본 유형 잘 (INT32, DOUBLE, BINARY 문자열)을 작성할 수 있습니다.

나는 NULL 값을 작성해야합니다,하지만 난 방법을 모르겠어요. 나는 ParquetWriter에 널 (null) 작성 단순히 시도했습니다, 그것은 예외가 발생합니다.

어떻게 NULL이 org.apache.parquet.hadoop.ParquetWriter를 사용하여 작성할 수있다? null 허용 유형이 있습니까?

내가 믿는 코드는 자체 설명입니다 :

    ArrayList<Type> fields = new ArrayList<>();
    fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.INT32, "int32_col", null));
    fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.DOUBLE, "double_col", null));
    fields.add(new PrimitiveType(Type.Repetition.OPTIONAL, PrimitiveTypeName.BINARY, "string_col", null));
    MessageType schema = new MessageType("input", fields);

    Configuration configuration = new Configuration();
    configuration.setQuietMode(true);
    GroupWriteSupport.setSchema(schema, configuration);
    SimpleGroupFactory f = new SimpleGroupFactory(schema);
    ParquetWriter<Group> writer = new ParquetWriter<Group>(
      new Path("output.parquet"),
      new GroupWriteSupport(),
      CompressionCodecName.SNAPPY,
      ParquetWriter.DEFAULT_BLOCK_SIZE,
      ParquetWriter.DEFAULT_PAGE_SIZE,
      1048576,
      true,
      false,
      ParquetProperties.WriterVersion.PARQUET_1_0,
      configuration
    );

    // create row 1 with defined values
    Group group1 = f.newGroup();
    Integer int1 = 100;
    Double double1 = 0.5;
    String string1 = "string-value";
    group1.add(0, int1);
    group1.add(1, double1);
    group1.add(2, string1);
    writer.write(group1);

    // create row 2 with NULL values -- does not work!
    Group group2 = f.newGroup();
    Integer int2 = null;
    Double double2 = null;
    String string2 = null;
    group2.add(0, int2); // <-- throws NullPointerException
    group2.add(1, double2); // <-- throws NullPointerException
    group2.add(2, string2); // <-- throws NullPointerException
    writer.write(group2);

    writer.close();

해결법

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

    1.이 솔루션은 매우 간단 밝혀, 단지 값을 쓰지 않는다 :

    이 솔루션은 매우 간단 밝혀, 단지 값을 쓰지 않는다 :

    // create row 1 with defined values
    Group group1 = f.newGroup();
    Integer int1 = 100;
    Double double1 = 0.5;
    String string1 = "string-value";
    group1.add(0, int1);
    group1.add(1, double1);
    group1.add(2, string1);
    writer.write(group1);
    
    // create row 2 with NULL values -- does not work!
    Group group2 = f.newGroup();
    // do nothing !
    writer.write(group2);
    
    // Now, parquet file will have 2 rows, one with values, one with null values
    
  2. from https://stackoverflow.com/questions/55247724/how-can-i-write-null-value-to-parquet-using-org-apache-parquet-hadoop-parquetwri by cc-by-sa and MIT license