2017-02-06 5 views
2

J'ai cherché une solution à cette question.Est-il possible de lire et d'écrire du parquet en utilisant Java sans dépendre de Hadoop et HDFS?

Il me semble qu'il n'y a aucun moyen d'intégrer la lecture et l'écriture du format Parquet dans un programme Java sans tirer parti des dépendances de HDFS et Hadoop. Est-ce correct? Je veux lire et écrire sur un ordinateur client, en dehors d'un cluster Hadoop.

J'ai commencé à m'enthousiasmer à propos d'Apache Drill, mais il semble qu'il doit fonctionner comme un processus séparé. Ce dont j'ai besoin, c'est d'une capacité en cours de processus pour lire et écrire un fichier en utilisant le format Parquet.

Répondre

3

Vous pouvez écrire un cluster hadoop de format parquet à l'aide de Java Client API Parquet.

Voici un exemple de code en java qui écrit le format parquet sur un disque local.

{ 
final String schemaLocation = "/tmp/avro_format.json"; 
final Schema avroSchema = new Schema.Parser().parse(new File(schemaLocation)); 
final MessageType parquetSchema = new AvroSchemaConverter().convert(avroSchema); 
final WriteSupport<Pojo> writeSupport = new AvroWriteSupport(parquetSchema, avroSchema); 
final String parquetFile = "/tmp/parquet/data.parquet"; 
final Path path = new Path(parquetFile); 
ParquetWriter<GenericRecord> parquetWriter = new ParquetWriter(path, writeSupport, CompressionCodecName.SNAPPY, BLOCK_SIZE, PAGE_SIZE); 
final GenericRecord record = new GenericData.Record(avroSchema); 
record.put("id", 1); 
record.put("age", 10); 
record.put("name", "ABC"); 
record.put("place", "BCD"); 
parquetWriter.write(record); 
parquetWriter.close(); 
} 

avro_format.json,

{ 
    "type":"record", 
    "name":"Pojo", 
    "namespace":"com.xx.test", 
    "fields":[ 
     { 
     "name":"id", 
     "type":[ 
      "int", 
      "null" 
     ] 
     }, 
     { 
     "name":"age", 
     "type":[ 
      "int", 
      "null" 
     ] 
     }, 
     { 
     "name":"name", 
     "type":[ 
      "string", 
      "null" 
     ] 
     }, 
     { 
     "name":"place", 
     "type":[ 
      "string", 
      "null" 
     ] 
     } 
    ] 
} 

Hope this helps.

+0

OK. Cela fonctionne (sur Windows) si j'ai winutils.exe. J'aurais dû formuler la question différemment. Je ne pense pas que je vais avoir winutils.exe disponible où je veux écrire (et lire). Cependant, comme demandé, cela répond (bien que je devrais comprendre la lecture). Je vous remercie. – Jesse

+1

Je devrais ajouter que j'ai trouvé des API obsolètes dans votre réponse. Je pense qu'il est prévu d'utiliser les Builders pour la création des objets AvroWriteSupport et ParquetWriter. – Jesse

+0

Oui, les constructeurs sont obsolètes, pas la classe. Comme vous l'avez dit, nous devrions utiliser les constructeurs. – Krishas