【问题标题】:Write Parquet MAP datatype by PyArrow通过 PyArrow 编写 Parquet MAP 数据类型
【发布时间】:2020-10-06 01:01:57
【问题描述】:

我正在使用 Python 编写代码,并希望使用 PyArrow 生成 Parquet 文件。

根据我的理解和the Implementation Status,C++ (Python) 库已经实现了 MAP 类型。从the Data Types,也可以找到类型map_(key_type, item_type[, keys_sorted])

因此,我在 Python/PyArrow 中使用了几种不同的方法进行了测试。但都失败了。

例如:

df = pd.DataFrame({
        'col1': pd.Series([
            [('key', 'aaaa'), ('value', '1111')],
            [('key', 'bbbb'), ('value', '2222')],
        ]),
        '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, FILE_NAME)

当我使用parquet-tools cat rand_gen_test_map.parquet 读取文件时,我得到:

col1:
.key_value:
.key_value:
col2 = foo

col1:
.key_value:
.key_value:
col2 = bar

在我看来,地图值没有正确输出(或遗漏)。虽然架构是正确的:

message schema {
  optional group col1 (MAP) {
    repeated group key_value {
      required binary key (UTF8);
      optional binary value (UTF8);
    }
  }
  optional binary col2 (UTF8);
}

总而言之,我有两个问题(都在 Python 中):

  1. 使用 MAP 数据类型生成 Parquet 文件的最佳方法是什么(如果可以附上示例,那就太好了)

  2. 我知道我们可以使用STRUCT 来模拟地图结构。但是由于 Parquet 提供了 MAP 类型,我们仍然想使用它。如果无法生成 MAP 数据类型,那么提供 MAP 类型的原因是什么?

【问题讨论】:

    标签: python pyarrow apache-arrow


    【解决方案1】:

    编写地图类型时出现错误。这应该在 pyarrow 2.0 中修复(现在原生支持读取)

    【讨论】:

    • 谢谢@micah-kornfield,新版本确实为我解决了这个问题。非常感谢!
    • 请注意,不幸的是,2.0 中也存在一些错误,希望 3.0 已将它们全部修复。
    猜你喜欢
    • 2019-02-06
    • 2018-08-16
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多