如何使用PyArrow覆盖Hive分区数据集中分区列的类型推断?

问题描述

我在Hive样式的分区镶木地板数据集中有一个分区列(由PyArrow从Pandas Dataframe编写),其条目为“ TYPE = 3860877578”。尝试从此数据集中读取时,出现错误

ArrowInvalid: error parsing '3760212050' as scalar of type int32

这是第一个不适合int32的分区键(即其他分区中的整数值较小-我认为必须在遇到的第一个分区上进行推断)。看起来应该可以在数据集级别覆盖推断的类型(到int64甚至是字符串),但是我不知道如何从这里到达:-)到目前为止,我一直在使用Pandas.read_parquet ()接口,并将过滤器,列等向下传递到PyArrow。我想我将需要直接使用PyArrow API,但不知道从哪里开始。

如何告诉PyArrow将此列视为int64或字符串类型,而不是尝试推断该类型?

导致此问题的数据集分区值的示例:

/mydataset/TYPE=12345/*.parquet
/mydataset/TYPE=3760212050/*.parquet

可重现Pandas 1.1.1和PyArrow 1.0.1问题的代码

import pandas as pd
# pyarrow is available and used
df = pd.read_parquet("mydataset")

无法通过过滤避免出现问题的值来避免此问题,因为所有分区值似乎都是在过滤之前进行了解析,即

import pandas as pd
# pyarrow is available and used
df = pd.read_parquet("mydataset",filters=[[('TYPE','=','12345')]])

自从我的原始帖子以来,我发现我可以像这样直接使用PyArrow API做我想做的事情:

from pyarrow.dataset import HivePartitioning
from pyarrow.parquet import ParquetDataset
import pyarrow as pa
        
partitioning = HivePartitioning(pa.schema([("TYPE",pa.int64())]))

df = ParquetDataset("mydataset",filters=filters,partitioning=partitioning,use_legacy_dataset=False).read_pandas().to_pandas()

我希望能够通过Pandas的read_parquet()接口将该信息向下传递,但是目前看来这是不可能的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)