14

Map<String, Object>Java または Scala で寄木細工のファイルを読み書きする方法の簡潔な例をお探しですか?

com.fasterxml.jackson.databind.ObjectMapper Java でシリアライザーとして使用する (つまり、parquet を使用して同等のものを探す)と予想される構造は次のとおりです。

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);        
}
4

3 に答える 3

2

私は寄木細工についてはあまり得意ではありませんが、ここから:

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 コレクション)を変更します。

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" ) );

私はコードをテストしませんでしたが、試してみてください..

于 2015-06-05T10:13:37.490 に答える
0

これをすぐに利用できる解決策があるとは思えません。マップについて話すとき、マップの値がプリミティブ型、またはプリミティブ型フィールドを持つ complexType である場合、マップから AvroSchema を作成することは依然として可能です。

あなたの場合、

  • マップの値がintであるスキーマを作成するMap =>がある場合。
  • 地図があれば、
    • を。CustomObject にはフィールド int、float、char ... (つまり、任意のプリミティブ型) があり、スキーマ生成が有効になり、parquet に正常に変換するために使用できます。
    • b. CustomObject にプリミティブではないフィールドが含まれている場合、生成されるスキーマは不正な形式になり、結果の ParquetWritter は失敗します。

この問題を解決するには、オブジェクトを にJsonObject変換してから、Apache Spark ライブラリを使用してそれを Parquet に変換してみてください。

于 2019-07-22T05:30:54.893 に答える
-1

Apache Drill があなたの答えです!

寄木細工に変換: ドリルで CTAS (テーブルを作成) 機能を使用できます。デフォルトでは、drill は以下のクエリを実行した後、parquet ファイルを含むフォルダーを作成します。任意のクエリを置き換えることができ、ドリルはクエリの出力を寄木細工のファイルに書き込みます

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/を参照してください。

于 2015-08-06T17:27:26.210 に答える