问题描述
有人可以提示我如何使用 PyArrow's new filesystem interface(即上传、copyFromLocal)将文件从本地文件系统复制到 HDFS 文件系统?
我反复阅读了文档,并尝试了一些方法(使用 copy_file() 和 FS URI),但似乎都不起作用。 legacy HDFS API 的用法很简单,但它已被弃用,尽管新 API 似乎不完整。当然,在文件描述符之间移动数据块是一种解决方案,但为什么 copy_file() 存在呢?
解决方法
新(或旧)文件系统 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,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
将文件从文件系统上的一个名称复制到同一文件系统上的另一个名称。它不能用于在不同文件系统之间复制文件。