PyArrow: Как скопировать файлы с локального на удаленный с помощью нового интерфейса файловой системы?

#python #hdfs #pyarrow #apache-arrow

Вопрос:

Может ли кто-нибудь дать мне подсказку о том, как я могу скопировать файл из локальной файловой системы в файловую систему HDFS, используя новый интерфейс файловой системы PyArrow (т. Е. Загрузить, копировать локально)?

Я прочитал документацию взад и вперед и попробовал несколько вещей (используя copy_file() с URI FS), но, похоже, ничего из этого не работает. Использование устаревшего API HDFS является простым, но оно устарело, хотя новый API кажется неполным. Конечно, перемещение фрагментов данных между файловыми дескрипторами является решением, но почему тогда существует функция copy_file ()?

Ответ №1:

В новых (или старых) API-интерфейсах файловой системы нет функций для передачи файлов между файловыми системами.

Конечно, перемещение фрагментов данных между файловыми дескрипторами-это решение

Я не уверен, что это то, о чем вы думали, но вот простая утилита (и демонстрация) о том, как это сделать с python:

 import filecmp
import pyarrow.fs as pafs

BATCH_SIZE = 1024 * 1024

def transfer_file(in_fs, in_path, out_fs, out_path):
    with in_fs.open_input_stream(in_path) as in_file:
        with out_fs.open_output_stream(out_path) as out_file:
            while True:
                buf = in_file.read(BATCH_SIZE)
                if buf:
                    out_file.write(buf)
                else:
                    break

local_fs = pafs.LocalFileSystem()
s3fs = pafs.S3FileSystem()
in_path = '/tmp/in.data'
out_path = 'mybucket/test.data'
back_out_path = '/tmp/in_copy.data'

transfer_file(local_fs, in_path, s3fs, out_path)
transfer_file(s3fs, out_path, local_fs, back_out_path)

files_match = filecmp.cmp(in_path, back_out_path)
print(f'Files Match: {files_match}')
 

Я ожидал transfer_file бы получить хорошую производительность. Могут возникнуть некоторые ситуации (например, чтение из S3), в которых может быть полезно использовать параллельное чтение read_at , что потребует немного большей сложности, но также должно быть выполнимым.

но тогда почему существует функция copy_file ()?

copy_file копирует файл с одного имени в файловой системе на другое имя в той же файловой системе. Его нельзя использовать для копирования файлов между различными файловыми системами.

Комментарии:

1. В этом есть смысл! Я подожду несколько дней для получения дополнительных ответов, но ваши мысли подтверждают мои предположения. Спасибо!