1

我正在尝试指定文件夹权限,然后dask.dataframe.to_parquet()partition_on参数一起使用,因为此参数为提供的 DataFrame 列中的每个组创建一个文件夹。

我已经尝试了以下代码,但没有任何运气。在这里,我设置了传递给的“主”文件夹的模式,to_parquet使得文件夹权限为drwxrws---(由 ls -la 显示),但创建的partition_on文件夹具有文件夹权限drwxr-sr-x

from pathlib import Path

@dask.delayed
def mkdir(folder_path):
    if not folder_path.exists():
        folder_path.mkdir()
        folder_path.chmod(mode=0o2770)
    return folder_path

path = Path('/scratch/...folder_path.../dataset/')
path_delayed = mkdir(path)

dask.delayed(ddf_postext.to_parquet)(
        path_delayed, compression='brotli', write_index=True, append=False,
        partition_on=['p_k10dato_YYYY_MM'], storage_options={'mode': 0o2770},
        engine='fastparquet')

注意:任务是 dask.delayed,因为我需要将镶木地板文件保存在与 Dask 调度程序/工作程序所在的同一台远程计算机上。

我想设置文件夹权限,因为我的 Dask 调度程序/工作人员正在使用与我的用户在同一组中的 Unix 用户,从而使我的用户能够删除 Dask 工作人员创建的文件夹,如果模式和组权限(27xx)已配置。

详细说明:文件夹的模式和权限设置为“2770”。SGID“2”确保文件夹中的新文件将使用与文件夹本身相同的组权限创建。umask "770" 确保用户和组成员都具有对该文件夹及其文件的读取、写入和执行权限,而所有其他用户都没有权限。

解决方案

正如@mdurant 指出的那样,首先正常保存文件,然后再更改权限。下面的新代码解决了我的文件夹权限问题:

import os
@dask.delayed
def save_parquet_files(ddf, folder_path, to_parquet_kwargs={}):
    """Save Dask DataFrame to parquests with shared group permisions."""
    save_data = ddf.to_parquet(folder_path, **to_parquet_kwargs)

    # set folder permissions as the partition_on argument creates a folder for
    #    each group in the provided DataFrame column.
    if 'partition_on' in to_parquet_kwargs.keys():
        for root, dirs, _ in os.walk(folder_path):  
            for momo in dirs:
                 os.chmod(os.path.join(root, momo), 0o2770)

save_parquet_files(
    ddf_postext, path_delayed, to_parquet_kwargs={
        'compression': 'brotli',
        'append': False,
        'partition_on': ['p_k10dato_YYYY_MM'],
        'engine': 'fastparquet'}).compute()
4

1 回答 1

0

正确的,

storage_options={'mode': 0o2770}

无效:这是文件系统的全局值,所有文件都rb以默认权限ab或模式打开。wb

我建议您正常保存文件,然后在之后创建一个功能来设置权限

def remote_chmod(path):
    for root, dirs, files in os.walk(path):  
        for momo in dirs:  
             os.chmod(os.path.join(root, momo), 0o2770)
        for momo in files:
             os.chmode(os.path.join(root, momo), 0o2770)

client.submit(remote_chmod)

请注意,文件系统fsspec.implementations.dask.DaskWorkerFileSystem包含 dask 工作人员所见的远程工作操作 - 但它没有实现 chmod/own。实际上,它应该被重写,以便可用的方法集取决于所讨论的远程文件系统的类。

于 2019-12-18T13:44:29.347 回答