首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为使用`dask.dataframe.to_parquet()`创建的文件夹设置文件夹权限(mkdir模式)?

如何为使用`dask.dataframe.to_parquet()`创建的文件夹设置文件夹权限(mkdir模式)?
EN

Stack Overflow用户
提问于 2019-12-18 10:53:57
回答 1查看 270关注 0票数 1

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

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

代码语言:javascript
运行
复制
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用户,因此,如果配置了模式和组权限(27xx),我的用户就可以删除Dask workers创建的文件夹。

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

解决方案

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

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-18 13:44:29

对,是这样,

代码语言:javascript
运行
复制
storage_options={'mode': 0o2770}

没有效果:这是文件系统的全局值,所有文件都以rbabwb模式打开,并具有默认权限。

我建议您正常保存文件,然后创建一个函数来设置权限。

代码语言:javascript
运行
复制
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/。实际上,应该重写它,以便可用的方法集取决于所讨论的远程文件系统的类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59390477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档