我试图指定文件夹权限,然后使用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用户,因此,如果配置了模式和组权限(27xx),我的用户就可以删除Dask workers创建的文件夹。
In details:文件夹的模式和权限设置为"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()
发布于 2019-12-18 13:44:29
对,是这样,
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/。实际上,应该重写它,以便可用的方法集取决于所讨论的远程文件系统的类。
https://stackoverflow.com/questions/59390477
复制相似问题