Jon*_*n.H 6 python dask python-3.7 fastparquet pyarrow
我正在使用 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']
)
Run Code Online (Sandbox Code Playgroud)
当使用 时engine='fastparquet,Dask 可以很好地读取所有其他列,但会None为具有复杂类型的列返回 s 列。当我设置时engine='pyarrow',出现以下异常:
ArrowNotImplementedError: lists with structs are not supported.
Run Code Online (Sandbox Code Playgroud)
许多谷歌搜索已经明确表明,现在并不真正支持读取带有嵌套数组的列,而且我不完全确定处理此问题的最佳方法是什么。我想我的选择是:
json。该模式很简单,如果可能的话就可以完成这项工作list并注意这些列中的数据通过索引相互关联/映射(例如,0这些键/列中的 idx 中的元素全部来自相同来源)。这会起作用,但坦率地说,让我心碎:(我很想听听其他人如何克服这个限制。我的公司经常在其镶木地板中使用嵌套数组,因此我不想放弃使用 Dask。
更公平地说,pandas(目前)对非简单类型的支持不是很好。可能的情况是 pyarrow 不会转换为 pandas,并且作为未来的某个点,pandas 将直接使用这些箭头结构。
事实上,我认为您可以使用的最直接的方法是将列重写为 B/JSON 编码文本,然后使用 fastparquet 加载,指定使用 B/JSON 加载。您应该在列中获得字典列表,但性能会很慢。
请注意,旧项目oamap及其后继者Awesome提供了一种使用 python 语法迭代和聚合嵌套列表/映射/结构树的方法,但使用 Numba 进行编译,这样您就不需要实例化中间 python 对象。它们不是为镶木地板设计的,但具有镶木地板兼容性,因此可能对您有用。
| 归档时间: |
|
| 查看次数: |
12486 次 |
| 最近记录: |