【问题标题】:How to write Parquet with user defined schema through pyarrow如何通过 pyarrow 使用用户定义的模式编写 Parquet
【发布时间】:2019-11-20 17:27:49
【问题描述】:

当我执行以下代码时 - 出现以下错误 ValueError: Table schema does not match schema used to create file.

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq


fields = [
    ('one', pa.int64()),
    ('two', pa.string(), False),
    ('three', pa.bool_())
]
schema = pa.schema(fields)

schema = schema.remove_metadata()
df = pd.DataFrame(
    {
        'one': [2, 2, 2],
        'two': ['foo', 'bar', 'baz'],
        'three': [True, False, True]
    }
)

df['two'] = df['two'].astype(str)

table = pa.Table.from_pandas(df, schema, preserve_index=False).replace_schema_metadata()
writer = pq.ParquetWriter('parquest_user_defined_schema.parquet', schema=schema)
writer.write_table(table)

【问题讨论】:

    标签: python-3.x pyarrow


    【解决方案1】:

    这适用于最新版本的 pyarrow (>=0.14.0),但我可以确认我也收到了 pyarrow 0.13 的错误)。

    原因是在从 pandas 到箭头的转换中没有保留架构的可空性的错误(请参阅https://issues.apache.org/jira/browse/ARROW-5169)。

    使用 pyarrow 0.13:

    >>> schema.field_by_name('two').nullable
    False
    
    >>> table.schema.field_by_name('two').nullable
    True
    

    这使得您指定的 schema 和传递给 write_table 的表的架构不匹配,导致您看到的错误。
    这是在 0.14 中修复的,两者都会在上面的输出中给出False

    因此,您可以在手动创建架构时删除nullable=False,或更新为箭头 >= 0.14。


    请注意,您正在将单个表写入单个 parquet 文件,您不需要手动指定架构(您在将 pandas DataFrame 转换为箭头表时已经指定了它,pyarrow 将使用表写入镶木地板)。所以在简单的情况下,你也可以这样做:

    pq.write_table(table, 'parquest_user_defined_schema.parquet')
    

    附加说明:您需要writer.close() 才能使您的示例完整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 2018-08-16
      • 2021-11-06
      • 1970-01-01
      • 2020-07-30
      • 2019-01-06
      • 2021-03-26
      • 1970-01-01
      相关资源
      最近更新 更多