熊猫:合并具有不同列dtypes的镶木地板文件-使用预定义的架构编写镶木地板吗?

时间:2019-08-30 08:39:19

标签: python pandas dataframe

我需要将非常大的数据库表导出到s3。 我这样做是通过并行化pandas read_sql(带有processpool),并使用表的主键ID来生成一个范围来为每个工人选择的。 -这样可以快速导出。

process 1: id between 1 and 9   -> 1.pq
process 2: id between 10 and 19 -> 2.pq
process 3: id between 20 and 29 -> 3.pq

每个工作人员将得到的数据帧写到同一文件夹中。

问题出在我的数据上:我拥有的某些列并不总是被填充(例如Deleted?null vs 1)-因此我的某些镶木地板将已删除的列数据类型设置为null,而其他类型则设置为Int64。

当我尝试从pyarrow,fastparquet或pyspark中读取数据集时,我会遇到有关架构的各种错误。

我曾尝试研究箭头表,但到目前为止仅找到了一种定义模式以仅用于验证的方法。

复制:

import pandas as pd
import pyarrow.parquet as pq

data=pd.DataFrame([[1,None],[1,None]])
data2=pd.DataFrame([[1,1],[1,1]])
data.columns = data.columns.astype(str) ## Parquet requires string column names
data2.columns = data2.columns.astype(str)
data.to_parquet('./outputs/1.pq')
data2.to_parquet('./outputs/2.pq')
pq.ParquetDataset('./outputs')

我希望它可以推断出我的列'1'是int,但是会发生冲突。我尝试禁用schema_validation,但这只是隐藏了问题,直到我真正处理它为止。

ValueError: Schema in ../outputs/2.pq was different. 
0: int64
1: int64
metadata
--------
{b'pandas': b'{"index_columns": [{"kind": "range", "name": null, "start": 0, "'
            b'stop": 2, "step": 1}], "column_indexes": [{"name": null, "field_'
            b'name": null, "pandas_type": "unicode", "numpy_type": "object", "'
            b'metadata": {"encoding": "UTF-8"}}], "columns": [{"name": "0", "f'
            b'ield_name": "0", "pandas_type": "int64", "numpy_type": "int64", '
            b'"metadata": null}, {"name": "1", "field_name": "1", "pandas_type'
            b'": "int64", "numpy_type": "int64", "metadata": null}], "creator"'
            b': {"library": "pyarrow", "version": "0.14.0"}, "pandas_version":'
            b' "0.24.2"}'}

vs

0: int64
1: null
metadata
--------
{b'pandas': b'{"index_columns": [{"kind": "range", "name": null, "start": 0, "'
            b'stop": 2, "step": 1}], "column_indexes": [{"name": null, "field_'
            b'name": null, "pandas_type": "unicode", "numpy_type": "object", "'
            b'metadata": {"encoding": "UTF-8"}}], "columns": [{"name": "0", "f'
            b'ield_name": "0", "pandas_type": "int64", "numpy_type": "int64", '
            b'"metadata": null}, {"name": "1", "field_name": "1", "pandas_type'
            b'": "empty", "numpy_type": "object", "metadata": null}], "creator'
            b'": {"library": "pyarrow", "version": "0.14.0"}, "pandas_version"'
            b': "0.24.2"}'}

1 个答案:

答案 0 :(得分:0)

您可以创建自己的自定义“ pyarrow模式”并使用您的模式转换每个pyarrow表。

id, d, e