gpt4 book ai didi

parquet - 如何使用 pyarrow 更改列数据类型

转载 作者:行者123 更新时间:2023-12-02 02:22:13 60 4
gpt4 key购买 nike

我正在读取一组箭头文件并将它们写入 parquet 文件:

import pathlib
from pyarrow import parquet as pq
from pyarrow import feather
import pyarrow as pa

base_path = pathlib.Path('../mydata')

fields = [
pa.field('value', pa.int64()),
pa.field('code', pa.dictionary(pa.int32(), pa.uint64(), ordered=False)),
]
schema = pa.schema(fields)

with pq.ParquetWriter('sample.parquet', schema) as pqwriter:
for file_path in base_path.glob('*.arrow'):
table = feather.read_table(file_path)
pqwriter.write_table(table)

我的问题是箭头文件中的 code 字段是使用 int8 索引而不是 int32 定义的。然而,int8 的范围还不够。因此,我为 parquet 文件中的字段 code 定义了一个具有 int32 索引的架构。

但是,将箭头表写入 parquet 现在会提示架构不匹配。

如何更改箭头列的数据类型?我检查了 pyarrow API,没有找到更改架构的方法。这可以在不往返 pandas 的情况下完成吗?

最佳答案

Arrow ChunkedArray 有 cast功能,但不幸的是它不适用于您想要做的事情:

>>> table['code'].cast(pa.dictionary(pa.int32(), pa.uint64(), ordered=False))
Unsupported cast from dictionary<values=uint64, indices=int8, ordered=0> to dictionary<values=uint64, indices=int32, ordered=0> (no available cast function for target type)

相反,您可以转换为 pa.uint64() 并将其编码为 dictionary :

>>> table['code'].cast(pa.uint64()).dictionary_encode().type
DictionaryType(dictionary<values=uint64, indices=int32, ordered=0>)

这是一个独立的示例:

import pyarrow as pa

source_schema = pa.schema([
pa.field('value', pa.int64()),
pa.field('code', pa.dictionary(pa.int8(), pa.uint64(), ordered=False)),
])

source_table = pa.Table.from_arrays([
pa.array([1, 2, 3], pa.int64()),
pa.array([1, 2, 1000], pa.dictionary(pa.int8(), pa.uint64(), ordered=False)),

], schema=source_schema)

destination_schema = pa.schema([
pa.field('value', pa.int64()),
pa.field('code', pa.dictionary(pa.int32(), pa.uint64(), ordered=False)),
])

destination_data = pa.Table.from_arrays([
source_table['value'],
source_table['code'].cast(pa.uint64()).dictionary_encode(),
], schema=destination_schema)

关于parquet - 如何使用 pyarrow 更改列数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66223730/

60 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com