【问题标题】:PyArrow: How to copy files from local to remote using new filesystem interface?PyArrow:如何使用新的文件系统接口将文件从本地复制到远程?
【发布时间】:2021-10-04 03:08:50
【问题描述】:

有人可以告诉我如何使用PyArrow's new filesystem interface(即上传、copyFromLocal)将文件从本地文件系统复制到 HDFS 文件系统吗?

我反复阅读了文档,并尝试了一些方法(使用带有 FS URI 的 copy_file()),但似乎都不起作用。 legacy HDFS API 的用法很简单,但它已被弃用,尽管新的 API 似乎不完整。当然,在文件描述符之间移动数据块是一种解决方案,但为什么copy_file() 存在呢?

【问题讨论】:

    标签: python hdfs pyarrow apache-arrow


    【解决方案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 将文件从文件系统上的一个名称复制到同一文件系统上的另一个名称​​。它不能用于在不同文件系统之间复制文件。

    【讨论】:

    • 有道理!我将等待几天以获得更多答案,但您的想法正在证实我的假设。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2020-07-18
    相关资源
    最近更新 更多