如果使用 pyarrow 将数据集写入镶木地板,如何更正 csv 文件混合类型?

How to correct csv file mixed types if using pyarrow write dataset to parquet?

我目前正在使用 pyarrow 将目录中的一堆 .csv 文件读取到数据集中,如下所示:

import pyarrow.dataset as ds

# create dataset from csv files
dataset = ds.dataset(input_pat,
                         format="csv",
                         exclude_invalid_files = True)

创建数据集后,我将其写入 parquet 格式,如下所示:

ds.write_dataset(dataset, 
                 format = "parquet", 
                 base_dir = output_path,
                 basename_template = "name_data" +'_{i}.parquet',
                 existing_data_behavior = "overwrite_or_ignore")
 

现在我将它用于两个数据集,其中第一个数据集运行良好。对于第二个数据集,我收到一个错误:

ArrowInvalid: In CSV column #14: Row #111060: CSV conversion error to null: invalid value '0'  

据我所知,PyArrow 不喜欢我的字符串列中有整数值(“0”)。现在,如果这是唯一的违规行为,我有没有办法在创建数据集时明确更正它?例如,我想在阅读时将“0”替换为“未知”。

这会很好,因为我不想事先更正附加功能中的错误。可以查到数据here。对于黄色出租车没有问题。读取绿色出租车的 csv 文件时出现问题。

如果我定义模式,错误会解决吗?它会理解,它应该将“0”视为字符串吗?

我的理解是,在大多数文件中,第 14 列 (ehail_fee) 包含空值。

加载 csv 数据集时,arrow 在打开它找到的第一个文件时尝试猜测每一列的类型。此时它假定第 14 列的类型为 pyarrow.null()。当它找到包含该列的非空值的文件时,它会抛出错误。

If I define the schema, will the error be solved? Will it understand, that it should treat "0" as a string?

应该可行(但我认为它应该是 pyarrow.float() 而不是 pyarrow.string())。