我需要将非常大的数据库表导出到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"}'}
答案 0 :(得分:0)
您可以创建自己的自定义“ pyarrow模式”并使用您的模式转换每个pyarrow表。
id, d, e