чтение секционированных наборов данных, хранящихся как csv, с помощью 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, имеют ненулевые значения в столбцах, которые не являются столбцами разделения.

Есть ли обходной путь, как загрузить данные без заголовков?


person ira    schedule 11.03.2021    source источник


Ответы (2)


В стрелке есть способ открывать отдельные 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/[email protected]/msg12849.html

person 0x26res    schedule 11.03.2021
comment
Это то, что я пытаюсь использовать сейчас, но это становится немного утомительным, когда вы перебираете фрагменты набора данных, читаете таблицу и фильтруете для каждого файла отдельно. - person ira; 12.03.2021

По умолчанию pyarrow берет схему, выведенную из первого файла CSV, и использует эту предполагаемую схему для полного набора данных (поэтому он будет проецировать все другие файлы в секционированном наборе данных на эту схему и, например, теряет любые столбцы, отсутствующие в первом файле. ).

Если ваши файлы имеют разные схемы, вы можете передать схему вручную (чтобы переопределить вывод из первого файла):

schema = pa.schema(...)
dataset = ds.dataset(
    'path_to_my_dataset', filesystem=filesystem, format='csv',
    partitioning='hive', schema=schema,
)

См. Аргумент schema в https://arrow.apache.org/docs/python/generated/pyarrow.dataset.dataset.html

Однако приведенное выше работает только в том случае, если у вас действительно есть имена столбцов, включенные в файлы CSV (для сопоставления правильных столбцов в файле с полями схемы).
Если это не так, и вы хотите указать имена столбцов вручную (вместо использования первой строки), что станет возможным в будущем, если будет предоставлена ​​опция для формата файла CSV:

import pyarrow.dataset as ds
from pyarrow import csv

dataset = ds.dataset(
    'path_to_my_dataset', filesystem=filesystem, partitioning='hive', 
    format=ds.CsvFileFormat(read_options=csv.ReadOptions(column_names=["a", "b"]))
)

Но это ключевое слово присутствует только начиная с версии pyarrow 4.0.0 (которая будет выпущена в апреле 2021 года).

person joris    schedule 16.03.2021
comment
Можно ли каким-то образом вывести типы данных из файла, но имена столбцов указать вручную? - person ira; 18.03.2021
comment
Кроме того, когда я предоставляю схему вручную, я вижу, что во всех моих столбцах, не разделенных на разделы, отсутствуют значения. - person ira; 18.03.2021
comment
Ах да, мой ответ работает, только если имена действительно присутствуют. То, что вы хотите (указание имен столбцов вручную, если они отсутствуют в первой строке файлов CSV), станет возможным, начиная со следующей версии pyarrow 4.0 (ожидается в апреле 2021 г.), см. Также issues.apache.org/jira/browse/ARROW-8631 - person joris; 18.03.2021