Подтвердить что ты не робот

Как читать и писать Map <String, Object> из/в файл паркета в Java или Scala?

Ищем краткий пример о том, как читать и писать Map<String, Object> из/в файл паркета в Java или Scala?

Здесь ожидаемая структура, используя com.fasterxml.jackson.databind.ObjectMapper как сериализатор в Java (т.е. ищет эквивалент с использованием паркета):

public static Map<String, Object> read(InputStream inputStream) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();

    return objectMapper.readValue(inputStream, new TypeReference<Map<String, Object>>() {

    });
}

public static void write(OutputStream outputStream, Map<String, Object> map) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();

    objectMapper.writeValue(outputStream, map);        
}
4b9b3361

Ответ 1

я не совсем хорош в паркет, но отсюда:

Schema schema = new Schema.Parser().parse(Resources.getResource("map.avsc").openStream());

    File tmp = File.createTempFile(getClass().getSimpleName(), ".tmp");
    tmp.deleteOnExit();
    tmp.delete();
    Path file = new Path(tmp.getPath());

    AvroParquetWriter<GenericRecord> writer = 
        new AvroParquetWriter<GenericRecord>(file, schema);

    // Write a record with an empty map.
    ImmutableMap emptyMap = new ImmutableMap.Builder<String, Integer>().build();
    GenericData.Record record = new GenericRecordBuilder(schema)
        .set("mymap", emptyMap).build();
    writer.write(record);
    writer.close();

    AvroParquetReader<GenericRecord> reader = new AvroParquetReader<GenericRecord>(file);
    GenericRecord nextRecord = reader.read();

    assertNotNull(nextRecord);
    assertEquals(emptyMap, nextRecord.get("mymap"));

В вашей ситуации измените ImmutableMap (Google Collections) с картой по умолчанию, как показано ниже:

Schema schema = new Schema.Parser().parse( Resources.getResource( "map.avsc" ).openStream() );

        File tmp = File.createTempFile( getClass().getSimpleName(), ".tmp" );
        tmp.deleteOnExit();
        tmp.delete();
        Path file = new Path( tmp.getPath() );

        AvroParquetWriter<GenericRecord> writer = new AvroParquetWriter<GenericRecord>( file, schema );

        // Write a record with an empty map.
        Map<String,Object> emptyMap = new HashMap<String, Object>();

        // not empty any more
        emptyMap.put( "SOMETHING", new SOMETHING() );
        GenericData.Record record = new GenericRecordBuilder( schema ).set( "mymap", emptyMap ).build();
        writer.write( record );
        writer.close();

        AvroParquetReader<GenericRecord> reader = new AvroParquetReader<GenericRecord>( file );
        GenericRecord nextRecord = reader.read();

        assertNotNull( nextRecord );
        assertEquals( emptyMap, nextRecord.get( "mymap" ) );

Я не тестировал код, но попробовал...

Ответ 2

Я сомневаюсь, что есть решение для этого легко доступно. Когда вы говорите о Картах, все еще возможно создать из него AvroSchema, при условии, что значения карт являются примитивным типом или complexType, у которого inturn имеет поля примитивного типа.

В твоем случае,

  • Если у вас есть Map =>, которая создаст схему со значениями карты, являющимися int.
  • Если у вас есть карта,
    • а. CustomObject имеет поля int, float, char... (т.е. Любой примитивный тип), генерация схемы будет действительной и затем может быть использована для успешного преобразования в паркет.
    • б. CustomObject имеет поля, которые не являются примитивными, сгенерированная схема будет искажена, и получающийся в результате ParquetWritter завершится ошибкой.

Чтобы решить эту проблему, вы можете попытаться преобразовать ваш объект в JsonObject а затем использовать библиотеки Apache Spark для преобразования его в Parquet.

Ответ 3

Apache Drill - ваш ответ!

Преобразование в паркет: вы можете использовать функцию CTAS (create table as) в упражнении. По умолчанию сверление создает папку с паркетными файлами после выполнения запроса ниже. Вы можете заменить любой запрос и сверлить записи вывода вашего запроса в паркетные файлы

create table file_parquet as select * from dfs.`/data/file.json`;

Преобразование из паркета: мы также используем функцию CTAS здесь, однако мы просим дрель использовать другой формат для записи вывода

alter session set `store.format`='json';
create table file_json as select * from dfs.`/data/file.parquet`;

Подробнее о http://drill.apache.org/docs/create-table-as-ctas-command/