web-dev-qa-db-fra.com

Données imbriquées dans Parquet avec Python

J'ai un fichier qui a un JSON par ligne. Voici un exemple:

{
    "product": {
        "id": "abcdef",
        "price": 19.99,
        "specs": {
            "voltage": "110v",
            "color": "white"
        }
    },
    "user": "Daniel Severo"
}

Je souhaite créer un fichier parquet avec des colonnes telles que:

product.id, product.price, product.specs.voltage, product.specs.color, user

Je sais que parquet a un encodage imbriqué utilisant l'algorithme Dremel, mais je n'ai pas pu l'utiliser dans python (je ne sais pas pourquoi).

Je suis un gros pandas et utilisateur dask, donc le pipeline que j'essaye de construire est json data -> dask -> parquet -> pandas, bien que si quelqu'un a un exemple simple de création et de lecture de ces encodages imbriqués dans parquet en utilisant Python je pense que ce serait assez bien: D

[~ # ~] modifier [~ # ~]

Donc, après avoir creusé dans les PR, j'ai trouvé ceci: https://github.com/dask/fastparquet/pull/177

c'est ce que je veux faire. Bien que je ne puisse toujours pas le faire fonctionner tout au long. Comment dire exactement à dask/fastparquet que ma colonne product est imbriquée?

13
Daniel Severo

L'implémentation des conversions à la fois sur le chemin de lecture et d'écriture pour les données imbriquées Parquet arbitraires est assez compliquée à réaliser - implémenter l'algorithme de déchiquetage et de réassemblage avec les conversions associées à certaines structures de données Python. Nous avons cela sur la feuille de route dans Arrow/parquet-cpp (voir https://github.com/Apache/parquet-cpp/tree/master/src/parquet/arrow ), mais elle n'est pas encore terminée (seule la prise en charge des structures simples et des listes/tableaux est prise en charge maintenant.) Il est important d'avoir cette fonctionnalité car d'autres systèmes qui utilisent Parquet, comme Impala, Hive, Presto, Drill et Spark, ont une prise en charge native des types imbriqués dans leur SQL dialectes, nous devons donc être capables de lire et d'écrire ces structures fidèlement à partir de Python.

Cela peut également être implémenté dans fastparquet, mais cela va demander beaucoup de travail (et des cas de test à écrire), peu importe la façon dont vous le découpez.

Je prendrai probablement le travail (en parquet-cpp) personnellement plus tard cette année si personne ne me bat, mais j'aimerais avoir de l'aide.

9
Wes McKinney