DataFusion (Apache Arrow): как лениво читать пакеты результатов?

У меня есть запрос на объединение данных. Вместо того, чтобы ждать обработки всех пакетов, я хотел бы запустить некоторый код, как только первый пакет будет готов.

Вот код ожидания и обработки:

let dataframe = ExecutionContext::new().read_parquet(filename)?;
let batchs = dataframe.collect().await?;

for batch in batchs {
    // Do something with the record batch
    println!("{:?}", batch.schema());
}

Я хотел бы что-то, что вернет мне не обещание массива BatchRecord, а скорее массив обещаний BatchRecord. Предоставляет ли DataFusion способ получить только первый пакет, не дожидаясь полной обработки файла паркета?

В настоящее время у меня время загрузки при запуске составляет 5 + мин, и это просто непрактично. Прямое использование Arrow & Parquet позволило бы мне сразу получить доступ к первой партии (с обменом api / features).

Изменить: минимальный пример можно найти в DataFusion git репозиторий


person Jeremy Cochoy    schedule 13.10.2020    source источник
comment
Трудно сказать без минимального воспроизводимого примера, но похоже, что dataframe уже является итератором, обещающим что-то. Итак, просто перебрать dataframe без collect?   -  person Jmb    schedule 13.10.2020
comment
@Jmb Я добавил ссылку на минимальный пример, предоставленный проектом Apache / Arrow. Это не похоже на то, что вы можете перебирать Arc<dyn DataFrame>, поскольку черта DataFrame не подходит для реализации Iterator.   -  person Jeremy Cochoy    schedule 14.10.2020


Ответы (1)


Со времени выпуска 2.0.0 в основной ветке были внесены некоторые изменения для лучшей поддержки асинхронной и потоковой передачи, поэтому стоит проверить последний код, но метод сбора DataFrame загружает все результаты в память перед возвратом, поэтому это может быть не так. лучший подход.

Вероятно, было бы неплохо спросить об этом и в списке рассылки Arrow.

person Andy Grove    schedule 09.11.2020