#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. В этом есть смысл! Я подожду несколько дней для получения дополнительных ответов, но ваши мысли подтверждают мои предположения. Спасибо!