PyArrow:如何使用新的文件系统接口将文件从本地复制到远程?

问题描述

有人可以提示我如何使用 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 将文件从文件系统上的一个名称复制到同一文件系统上的另一个名称。它不能用于在不同文件系统之间复制文件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...