4

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 の使用を手放す必要はありません。

4

2 に答える 2

2

pyarrow.lib.ArrowNotImplementedError: Reading lists of structs from Parquet files not yet supportedPandas を使用して読み込もうとしたときに対処しています。ただし、pyspark を使用して読み取ってから pandas に変換すると、少なくともデータが読み込まれます。

import pyspark
spark = pyspark.sql.SparkSession.builder.getOrCreate()
df = spark.read.load(path)
pdf = df.toPandas()

問題のあるフィールドは pyspark Row オブジェクトとしてレンダリングされます。これには構造化された解析が含まれていますが、それらからデータを抽出するには、おそらくカスタム pandas 関数を作成する必要があります。

>>> pdf["user"][0]["sessions"][0]["views"]
[Row(is_search=True, price=None, search_string='ABC', segment='listing', time=1571250719.393951), Row(is_search=True, price=None, search_string='ZYX', segment='homepage', time=1571250791.588197), Row(is_search=True, price=None, search_string='XYZ', segment='listing', time=1571250824.106184)]

個々のレコードはディクショナリとしてレンダリングできます.asDict(recursive=True)。目的の Row オブジェクトを呼び出すだけです。

残念ながら、SparkSession コンテキストを開始するのに約 5 秒かかり、すべてのスパーク アクションも (小規模から中規模のデータセットの場合) pandas 操作よりもはるかに長い時間がかかるため、より Python ネイティブなオプションを強くお勧めします。

于 2019-11-06T17:31:17.783 に答える