【问题标题】:No data for map column of a parquet file created from pyarrow and pandas从 pyarrow 和 pandas 创建的镶木地板文件的地图列没有数据
【发布时间】:2021-01-13 03:28:46
【问题描述】:

我跟随pyarrow data types for columns that have lists of dictionaries? 创建了一个箭头表,其中包含一列 MapType。

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

print(f'PyArrow Version = {pa.__version__}')
print(f'Pandas Version = {pd.__version__}')

df = pd.DataFrame({
        'col1': pd.Series([
            [('id', 'something'), ('value2', 'else')],
            [('id', 'something2'), ('value','else2')],
        ]),
        'col2': pd.Series(['foo', 'bar'])
    }
)

udt = pa.map_(pa.string(), pa.string())
schema = pa.schema([pa.field('col1', udt), pa.field('col2', pa.string())])
table = pa.Table.from_pandas(df, schema)
pq.write_table(table, './test_map.parquet')

以上代码在我的开发电脑上运行流畅:

PyArrow Version = 1.0.1
Pandas Version = 1.1.2

并成功生成了test_map.parquet文件。

然后我使用 parquet-tools (1.11.1) 读取文件,但得到以下输出:

col1:
.key_value:
.key_value:
col2 = foo

col1:
.key_value:
.key_value:
col2 = bar

缺少键和值... 你能帮我解决这个问题吗?

【问题讨论】:

  • 您能否确认您使用的是哪个版本的parquet-tools?我找不到 1.11.1
  • 我从 Maven Central 下载了 parquet-tools 1.11.1(parquet.apache.org/downloads 上有一个链接)。请注意,它需要 Hadoop 集群才能运行。

标签: pandas pyarrow


【解决方案1】:

我们于 2020 年 9 月 30 日向 Apache Arrow 提交了一个 JIRA 问题:https://issues.apache.org/jira/browse/ARROW-10140

该问题已在 2020 年 10 月 20 日发布的 PyArrow 2.0.0 中得到解决。

所以如果您在使用地图类型时遇到同样的问题,请将您的 PyArrow 升级到 2.0.0(或将来更高版本)。

【讨论】:

    【解决方案2】:

    我尝试复制,但出现此错误:

    pyarrow.lib.ArrowNotImplementedError: Reading lists of structs from Parquet files not yet supported: key_value: list<key_value: struct<key: string not null, value: string> not null> not null
    

    正如错误列表中提到的,在从 parquet 读取时,结构和映射都没有得到很好的支持。

    我建议为您的数据使用更简单的架构,例如:

    df = pd.DataFrame({
            'col1': pd.Series([
                {'id': 'something', 'value':'else'},
                {'id': 'somethings', 'value':'elses'},
            ]),
            'col2': pd.Series(['foo', 'bar'])
        }
    )
     
    udt = pa.struct([pa.field('id', pa.string()), pa.field('value', pa.string())])
    schema = pa.schema([pa.field('col1', udt), pa.field('col2', pa.string())])
    
    table = pa.Table.from_pandas(df, schema)
    

    哪个输出:

    +----------------------------------------+--------+
    | col1                                   | col2   |
    |----------------------------------------+--------|
    | {'id': 'something', 'value': 'else'}   | foo    |
    | {'id': 'somethings', 'value': 'elses'} | bar    |
    +----------------------------------------+--------+
    

    【讨论】:

    • 嗨亚瑟,谢谢你的建议。不幸的是,我们不能使用需要一组固定字段(包括字段名称)的结构。请参考issues.apache.org/jira/browse/ARROW-10140,我们从 Apache Arrow 团队获得了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2018-05-06
    • 2021-05-29
    • 2019-02-05
    • 2021-12-06
    • 2021-10-28
    相关资源
    最近更新 更多