问题描述
pyarrow 中是否有一种方法可以读取分区数据集,该数据集由第一行没有存储列名的 csv 文件组成?
我想做的基本上是:
from pyarrow import dataset as ds
from pyarrow import fs
filesystem = fs.HadoopFileSystem(host = 'my_host',port = 0,kerb_ticket = 'path_to_ticket_cache')
dataset = ds.dataset('path_to_my_dataset',filesystem = filesystem,format = 'csv',partitioning = 'hive')
my_data = dataset.to_table().to_pandas()
然而,pyarrow 默认假设每个 CSV 文件都具有相同的标题,因此只能正确加载分区列。对于其他列,它认为列名不匹配,因此只有从第一个 csv 文件加载的数据在非分区列的列中具有非空值。
解决方法
箭头中有一种方法可以打开没有标题的单个 csv 文件:
table = pa.csv.read_csv(csv_file,pa.csv.ReadOptions(column_names=['col1','col2']))
与:
foo,bar
hello,world
它返回:
| | col1 | col2 |
|---:|:-------|:-------|
| 0 | foo | bar |
| 1 | hello | world |
很遗憾,无法将 pa.csv.ReadOptions
传递给 dataset
函数。
PS:我觉得应该加到pa.dataset.CsvFileFormat
,有票:https://www.mail-archive.com/jira@arrow.apache.org/msg12849.html
默认情况下,pyarrow 采用从第一个 CSV 文件推断的模式,并将该推断模式用于完整数据集(因此它将分区数据集中的所有其他文件投影到此模式,例如丢失任何不存在于第一个文件)。
如果您的文件具有不同的架构,您可以手动传递架构(以覆盖从第一个文件推断出来的架构):
schema = pa.schema(...)
dataset = ds.dataset(
'path_to_my_dataset',filesystem=filesystem,format='csv',partitioning='hive',schema=schema,)
参见 https://arrow.apache.org/docs/python/generated/pyarrow.dataset.dataset.html
中的schema
参数
但是,只有当您确实在 CSV 文件中包含列名(以将文件中的正确列与架构字段相匹配)时,上述方法才有效。
如果不是这种情况,并且您想手动指定列名(而不是使用第一行),那么将来可以通过提供 CSV 文件格式的选项来实现:
import pyarrow.dataset as ds
from pyarrow import csv
dataset = ds.dataset(
'path_to_my_dataset',format=ds.CsvFileFormat(read_options=csv.ReadOptions(column_names=["a","b"]))
)
但此关键字仅从 pyarrow 4.0.0 版本(将于 2021 年 4 月发布)开始出现。