使用 pyarrow.dataset

问题描述

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 月发布)开始出现。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...