【问题标题】:How to specify logical types when writing Parquet files from PyArrow?从 PyArrow 编写 Parquet 文件时如何指定逻辑类型?
【发布时间】:2018-08-16 18:23:11
【问题描述】:

我正在使用 PyArrow 从 Python 中的一些 Pandas 数据帧中写入 Parquet 文件。

有没有一种方法可以指定写入 parquet 文件的逻辑类型?

例如,在 PyArrow 中写入 np.uint32 列会在 parquet 文件中生成 INT64 列,而使用 fastparquet 模块写入相同内容会导致逻辑类型为 UINT_32 的 INT32 列(这是PyArrow 的行为)。

例如:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
import fastparquet as fp
import numpy as np

df = pd.DataFrame.from_records(data=[(1, 'foo'), (2, 'bar')], columns=['id', 'name'])
df['id'] = df['id'].astype(np.uint32)

# write parquet file using PyArrow
pq.write_table(pa.Table.from_pandas(df, preserve_index=False), 'pyarrow.parquet')

# write parquet file using fastparquet
fp.write('fastparquet.parquet', df)

# print schemas of both written files
print('PyArrow:', pq.ParquetFile('pyarrow.parquet').schema)
print('fastparquet:', pq.ParquetFile('fastparquet.parquet').schema)

这个输出:

PyArrow: <pyarrow._parquet.ParquetSchema object at 0x10ecf9048>
id: INT64
name: BYTE_ARRAY UTF8

fastparquet: <pyarrow._parquet.ParquetSchema object at 0x10f322848>
id: INT32 UINT_32
name: BYTE_ARRAY UTF8

我在使用其他列类型时遇到了类似的问题,所以真的在寻找一种通用的方法来指定使用 PyArrow 编写时使用的逻辑类型。

【问题讨论】:

  • 只是出于兴趣,直接通过pyarrow写文件有没有好处(即而不是使用pd.to_parquet)?
  • @danodonovan 不是我所知道的,只是碰巧已经在用 pyarrow 做其他较低级别的事情,所以通过它而不是 Pandas 更容易完成所有写作。

标签: python pandas parquet pyarrow


【解决方案1】:

PyArrow默认写parquet 1.0版本文件,需要2.0版本才能使用UINT_32逻辑类型。

解决办法是在写表的时候指定版本,即

pq.write_table(pa.Table.from_pandas(df, preserve_index=False), 'pyarrow.parquet', version='2.0')

这会导致写入预期的 parquet 架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2019-02-06
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多