3

PyArrowを使用して、Python でいくつかのPandasデータフレームからParquetファイルを書き込んでいます。

寄木細工のファイルに書き込まれる論理型を指定する方法はありますか?

たとえば、np.uint32PyArrow に列を書き込むと、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 に答える