web-dev-qa-db-ja.com

Python

1行に1つのJSONがあるファイルがあります。ここにサンプルがあります:

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

次のような列を持つ寄木細工のファイルを作成したいと思います。

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

私は寄木細工がDremelアルゴリズムを使用してネストされたエンコーディングを持っていることを知っていますが、pythonでそれを使用することができませんでした(理由は不明))。

私はヘビーpandasおよびdaskユーザーなので、構築しようとしているパイプラインはjson data -> dask -> parquet -> pandas、ただしPythonを使用して寄木細工でこれらのネストされたエンコーディングを作成および読み取る簡単な例がある場合私はそれで十分だと思います:D

[〜#〜]編集[〜#〜]

だから、PRを掘り下げた後、私はこれを見つけました: https://github.com/dask/fastparquet/pull/177

基本的に私がやりたいことです。しかし、私はそれを完全に機能させることはできません。 dask/fastparquetにproduct列がネストされていると正確にどのように伝えますか?

13
Daniel Severo

任意のParquetネストデータの読み取りパスと書き込みパスの両方に変換を実装することは、正しく理解するのが非常に複雑です-いくつかのPythonデータ構造への変換に関連付けられたシュレッディングおよび再アセンブリアルゴリズムを実装します。これはArrow/parquet-cpp( https://github.com/Apache/parquet-cpp/tree/master/src/parquet/arrow を参照)のロードマップにありますが、まだ完了していません(現在、単純な構造体とリスト/配列のサポートのみがサポートされています。Impala、Hive、Presto、Drill、SparkなどのParquetを使用する他のシステムは、SQLでネストされた型をネイティブでサポートしているため、この機能を使用することが重要です方言なので、Pythonからこれらの構造を忠実に読み書きできる必要があります。

これはfastparquetでも同様に実装できますが、スライスする方法に関係なく、多くの作業(およびテストケースを記述する)になります。

だれも私に打ち負かされないなら、私はおそらく今年後半に(parquet-cppで)個人的に仕事を引き受けるでしょうが、私はいくつかの助けが欲しいです。

9
Wes McKinney