Dask を使用して、PySpark によって生成された Parquet ファイルを読み取っています。列の 1 つは辞書のリスト (つまりarray<map<string,string>>'
) です。df の例は次のとおりです。
import pandas as pd
df = pd.DataFrame.from_records([
(1, [{'job_id': 1, 'started': '2019-07-04'}, {'job_id': 2, 'started': '2019-05-04'}], 100),
(5, [{'job_id': 3, 'started': '2015-06-04'}, {'job_id': 9, 'started': '2019-02-02'}], 540)],
columns=['uid', 'job_history', 'latency']
)
を使用するengine='fastparquet
と、Dask は他のすべての列を正常に読み取りますがNone
、複合型の列に対して s の列を返します。を設定するとengine='pyarrow'
、次の例外が発生します。
ArrowNotImplementedError: lists with structs are not supported.
多くのグーグル検索により、ネストされた配列を使用した列の読み取りが現在実際にはサポートされていないことが明らかになりました。これを処理する最善の方法が何であるかは完全にはわかりません。私のオプションは次のとおりです。
json
標準ライブラリを使用して列を解析するように dask/fastparquet に指示する方法もあります。スキーマはシンプルで、可能であればそれでうまくいきます- 出力を生成した Spark ジョブを再実行して別のものとして保存できるかどうかを確認してください。
- マップのキーを列に変換し、dtype を使用してデータを複数の列に分割
list
し、これらの列のデータがインデックスによって相互に関連付け/マップされていることに注意してください (たとえば、0
これらのキー/列の idx の要素はすべて、同じソース)。これは機能しますが、率直に言って、私の心を壊します:(
他の人がこの制限をどのように回避したかを知りたいです。私の会社では、ネストされた配列をパークエストで頻繁に使用しています。このため、Dask の使用を手放す必要はありません。