【发布时间】:2019-11-23 05:31:39
【问题描述】:
我正在使用 Dask 读取由 PySpark 生成的 Parquet 文件,其中一列是字典列表(即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 可以正常读取所有其他列,但会为复杂类型的列返回Nones 列。当我设置engine='pyarrow' 时,出现以下异常:
ArrowNotImplementedError: lists with structs are not supported.
很多谷歌搜索已经清楚地表明,现在并不真正支持读取带有嵌套数组的列,而且我不完全确定处理这个问题的最佳方法是什么。我认为我的选择是:
- 告诉 dask/fastparquet 使用标准
json库解析列的一些方法。架构很简单,如果可能的话就可以完成这项工作 - 看看我是否可以重新运行生成输出的 Spark 作业并将其另存为其他内容,尽管这几乎不是一个可接受的解决方案,因为我的公司到处都使用镶木地板
- 将映射的键转换为列,并使用 dtype
list将数据分成几列,并注意这些列中的数据通过索引相互关联/映射(例如,idx 中的元素0这些键/列都来自同一来源)。这会奏效,但坦率地说,让我心碎:(
我很想听听其他人是如何绕过这个限制的。我的公司经常在他们的 parquest 中使用嵌套数组,因此我不想放弃使用 Dask。
【问题讨论】:
标签: python dask python-3.7 pyarrow fastparquet