我正在尝试指定文件夹权限,然后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()