从Dataframe到pyarrow表的Parquet创建转换不适用于对象数据类型

m0rkklqb  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(377)

我想从csv文件创建一个Parquet文件。出于测试目的,我在下面编写了一段代码,它读取一个文件,并首先将其转换为Dataframe,然后再转换为pyarrow表。然后,该表存储在awss3上,并希望对该表运行配置单元查询。
输入文件内容:

YEAR|WORD
2017|Word 1
2018|Word 2

代码:

dataFrame=pd.read_csv(inputFile, sep='|')
print(dataFrame)
print(dataFrame.dtypes)
print(dataFrame.columns)
dataFrame['C1'] = dataFrame['C1'].astype('str')
print(dataFrame.dtypes)
table=pa.Table.from_pandas(dataFrame)#,schema=pa.string())
pq.write_table(table, outputFile)

在写入pyarrow表之后,我查询了parquet文件,以确保数据可以很好地存储在s3中。然而结果却很奇怪:

+--------+--------------+
| YEAR  |     WORD     |
+--------+--------------+
| 2017   | [B@60716d4f  |
| 2018   | [B@36bf8f00  |
+--------+--------------+

不知何故,int值显示得很好,但是object/str值转换得不好。
感谢你的帮助。
谢谢。

suzh9iv8

suzh9iv81#

这对我往返旅行来说很好。请指定您的平台和版本 python , pandas 以及 pyarrow 在3.6/macox上(也在2.7上工作)

In [1]: import pandas as pd

In [2]: import pyarrow as pa

In [3]: pd.__version__
Out[3]: '0.19.2'

In [4]: pa.__version__
Out[4]: '0.2.0'

In [5]: data = """YEAR|WORD
   ...: 2017|Word 1
   ...: 2018|Word 2
   ...: """

In [6]: df = pd.read_csv(StringIO(data), sep='|')

In [7]: df
Out[7]: 
   YEAR    WORD
0  2017  Word 1
1  2018  Word 2

In [8]: df.dtypes
Out[8]: 
YEAR     int64
WORD    object
dtype: object

In [9]: table=pa.Table.from_pandas(df)

In [10]: import pyarrow.parquet as pq

In [12]: pq.write_table(table, 'foo.pk')

In [13]: pq.read_table('foo.pk').to_pandas()
Out[13]: 
   YEAR    WORD
0  2017  Word 1
1  2018  Word 2

In [14]: pq.read_table('foo.pk').to_pandas().dtypes
Out[14]: 
YEAR     int64
WORD    object
dtype: object

相关问题