2015-06-01 16 views
13

Cerchi un esempio conciso su come leggere e scrivere Map<String, Object> da/su file parquet in Java o Scala?Come leggere e scrivere la mappa <String, Object> da/al file parquet in Java o Scala?

Qui è prevista la struttura, utilizzando com.fasterxml.jackson.databind.ObjectMapper come serializzatore in Java (cioè alla ricerca di equivalente utilizzando 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);   
} 
+0

Controllare questo: https://github.com/Parquet/parquet-mr/blob/master/parquet-pig/src/main/java/parquet/pig/ParquetLoader .java –

+0

[Questa domanda non mostra alcuna ricerca h effort] (http://meta.stackexchange.com/a/223482/206336) – Ajoy

+0

@Una domanda appositamente distillata per l'essenza, ma aggiungerò un livello di dettaglio – okigan

risposta

2

io non sono abbastanza buona di legno, ma, da here:

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

Nella tua situazione cambia ImmutableMap (Google Collections) con una mappa predefinita come di seguito:

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

Non ho provato il codice, ma provalo ..

+0

Penso che non funzionerebbe; la chiave è serializzare 'Map ' e non sono sicuro se map.avsc (lo schema AVRO?) possa supportare la parte 'Object' (cioè deve essere un tipo concreto, che sconfigge lo scopo) – okigan

-1

Apache Drill è la tua risposta!

Converti in parquet: è possibile utilizzare la funzione CTAS (Crea tabella come) nel trapano. Per impostazione predefinita, il drill crea una cartella con i file parquet dopo aver eseguito la query seguente. È possibile sostituire qualsiasi query e trapano scrive l'output di si esegue una query in file parquet

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

convertire da parquet: Usiamo anche il CTAS caratterizzato da qui, tuttavia chiediamo trapano per utilizzare un formato diverso per la scrittura l'uscita

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

Fare riferimento alla http://drill.apache.org/docs/create-table-as-ctas-command/ per ulteriori informazioni

+0

in realtà non soddisfa lo spirito della domanda, vale a dire il programma standalone. 'Drill' è un'altra dipendenza dalla struttura pesante. – javadba

+0

@javadba Hmm ..... hai ragione. – rahul