3

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

有没有办法可以指定写入镶木地板文件的逻辑类型?

例如,np.uint32在 PyArrow 中写入一列会在 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 编写时使用的逻辑类型。

4

1 回答 1

3

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

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

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

然后,这会导致写入预期的镶木地板模式。

于 2018-03-08T16:48:58.703 回答