Pyarrow.lib.Schema和pyarrow.parquet.Schema的区别

3

当我尝试加载一个多分区的parquet文件时,由于缺失数据而填充null,导致一些模式被错误地推断为无效。我认为在pyarrow.parquet.ParquetDataset中指定模式可以解决这个问题,但我不知道如何构建正确的pyarrow.parquet.Schema类型的模式。以下是一些示例代码:

import pyarrow as pa
import pa.parquet as pq    
test_schema = pa.schema([pa.field('field1', pa.string()), pa.field('field2', pa.float64())])
paths = ['test_root/partition1/file1.parquet', 'test_root/partition2/file2.parquet']
dataset = pq.ParquetDataset(paths, schema=schema)

同时出现了以下错误:

AttributeError: 'pyarrow.lib.Schema' object has no attribute 'to_arrow_schema'

但是我找不到任何关于如何构建pyarrow.parquet.Schema模式的文档,就像文档中描述的那样(https://arrow.apache.org/docs/python/generated/pyarrow.parquet.ParquetDataset.html),我只能创建一个pyarrow.lib.Schema,但这却导致了上述错误。

2个回答

2

目前尚无法在Python中构建Parquet模式的API。但是,您可以使用从特定文件中读取的模式(请参见 pq.ParquetFile(...).schema)。

您能否在ARROW JIRA项目上开一个问题,请求在Python中构建Parquet模式的功能?

https://issues.apache.org/jira


1
谢谢,我会这样做的。但是我尝试了一种解决方法,创建了一个自己的包装类,其中包含 to_arrow_schema 函数的 pyarrow schema。现在我有一个模式,用它来创建一个 pyarrow 表格,在该表格上调用 write_to_dataset。当我在保存的文件上调用 pq.ParquetDataset 时,我使用相同的模式,但是我得到了一个 ValueError:test_file.parquet 中的模式不同。有什么办法可以解决这个问题吗?我在两侧都指定了相同的模式。 - user1111

2

感谢您(无论您是谁),如果ARROW JIRA中有票据和修复,则能够进行数据集文件模式合并并读取数据集:

import pyarrow as pa
import pa.parquet as pq

merged_schema = pa.schema([])

for filename in os.listdir(dataset_folder):
    schema_ = pq.read_table(os.path.join(dataset_folder, filename)).schema
    merged_schema = pa.unify_schemas([schema_, merged_schema])

读取数据集:

dset = pq.ParquetDataset(
           'my_dataset_folder', 
           schema=merged_schema,
           use_legacy_dataset=False
        ).read()

为了改进您的解决方案:使用pq.read_metadata而不是读取整个表,然后在统一之前使用to_arrow_schema() :) - Adrian
我认为使用pq.read_schema而不是pq.read_metadata会更好,因为它可以直接读取模式,无需进行后续转换。 - winderland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接