web-dev-qa-db-fra.com

créer des limes de parquet en java

Est-il possible de créer des fichiers de parquet à partir de java?

J'ai des données en mémoire (classes Java) et je veux les écrire dans un fichier parquet, pour les lire plus tard à partir d'Apache-drill.

Existe-t-il un moyen simple de procéder, comme insérer des données dans une table SQL?

JE L'AI

Merci pour l'aide.

En combinant les réponses et ce link , j'ai pu créer un fichier de parquet et le relire avec un exercice.

7
Imbar M.

Les constructeurs de ParquetWriter sont obsolètes (1.8.1) mais pas ParquetWriter lui-même, vous pouvez toujours créer ParquetWriter en développant la sous-classe abstract Builder à l'intérieur de celle-ci.

Voici un exemple des créateurs de parquet eux-mêmes ExampleParquetWriter :

  public static class Builder extends ParquetWriter.Builder<Group, Builder> {
    private MessageType type = null;
    private Map<String, String> extraMetaData = new HashMap<String, String>();

    private Builder(Path file) {
      super(file);
    }

    public Builder withType(MessageType type) {
      this.type = type;
      return this;
    }

    public Builder withExtraMetaData(Map<String, String> extraMetaData) {
      this.extraMetaData = extraMetaData;
      return this;
    }

    @Override
    protected Builder self() {
      return this;
    }

    @Override
    protected WriteSupport<Group> getWriteSupport(Configuration conf) {
      return new GroupWriteSupport(type, extraMetaData);
    }

  }

Si vous ne souhaitez pas utiliser Group et GroupWriteSupport (fournis dans Parquet mais uniquement à titre d'exemple d'implémentation de modèle de données), vous pouvez utiliser des modèles de données Avro, Protocol Buffers ou Thrift en mémoire. Voici un exemple utilisant l’écriture de Parquet avec Avro:

try (ParquetWriter<GenericData.Record> writer = AvroParquetWriter
        .<GenericData.Record>builder(fileToWrite)
        .withSchema(schema)
        .withConf(new Configuration())
        .withCompressionCodec(CompressionCodecName.SNAPPY)
        .build()) {
    for (GenericData.Record record : recordsToWrite) {
        writer.write(record);
    }
}   

Vous aurez besoin de ces dépendances:

<dependency>
    <groupId>org.Apache.parquet</groupId>
    <artifactId>parquet-avro</artifactId>
    <version>1.8.1</version>
</dependency>

<dependency>
    <groupId>org.Apache.parquet</groupId>
    <artifactId>parquet-hadoop</artifactId>
    <version>1.8.1</version>
</dependency>

Exemple complet ici .

7
MaxNevermind

Quelques façons possibles de le faire:

  • Utilisez la bibliothèque Java Parquet pour écrire Parquet directement à partir de votre code.
  • Connectez-vous à Hive ou Impala à l'aide de JDBC et insérez les données à l'aide de SQL. Veuillez noter que si vous insérez des lignes une par une, des fichiers distincts seront créés pour chaque enregistrement et ruineront totalement les performances. Vous devez insérer lots de lignes à la fois, ce qui n’est pas trivial, je ne recommande donc pas cette approche.
  • Enregistrez les données dans un fichier texte délimité, puis procédez comme suit dans Hive ou Impala:
    • Définissez un tableau sur le fichier texte pour permettre à Hive/Impala de lire les données. Appelons cette table text_table. Voir Impala's Créer une déclaration de table pour plus de détails.
    • Créez une nouvelle table avec des colonnes identiques en spécifiant Parquet comme format de fichier. Appelons cette table parquet_table.
    • Enfin, faites un insert into parquet_table select * from text_table pour copier toutes les données du fichier texte dans la table de parquet.
2
Zoltan