由于文件名的大小写差异,ADLS 中存在重复的文件夹。如何将 ACL 从一个文件夹移动到另一个文件夹?

问题描述 投票:0回答:1

我们的数据库存在多个数据质量问题,其中相同的文件名以不同的大小写多次提及。该数据被用作我们的 python 应用程序中的基础信息。由于 python 区分大小写,对于给定的文件名,我们最终会创建与大小写差异一样多的文件夹。我们在此基础上运行 ACL,现在将 ACL 分布在这些重复的文件夹中。

我们修复了数据库中的大小写差异。但是,现在我正在尝试找到一种方法来轻松有效地将应用于所有这些重复文件夹的 ACL 迁移到具有正确命名的各自目录中(并删除所有大小写不正确的重复文件夹)。

但我不知道如何解决这个问题。有什么方法可以使用 python 快速完成这个任务吗?

azure azure-active-directory azure-storage
1个回答
0
投票

由于文件名的大小写差异,ADLS 中存在重复的文件夹。如何将 ACL 从一个文件夹移动到另一个文件夹?

您可以使用以下 python 代码将

ACL
从一个文件夹移动到另一个文件夹,并使用 Azure python SDK 删除 Azure Data Lake gen2 存储中的重复文件夹(文件名存在差异)。

代码:

from azure.storage.filedatalake import DataLakeServiceClient
from azure.core.exceptions import ResourceNotFoundError


def get_data_lake_service_client(account_name, account_key):
    service_client = DataLakeServiceClient(
        account_url=f"https://{account_name}.dfs.core.windows.net",
        credential=account_key
    )
    return service_client


def list_directories(service_client, container_name):
    file_system_client = service_client.get_file_system_client(file_system=container_name)
    paths = file_system_client.get_paths()
    directories = [path.name for path in paths if path.is_directory]
    return directories


def get_directory_acls(service_client, container_name, directory_name):
    directory_client = service_client.get_directory_client(container_name, directory_name)
    acl_props = directory_client.get_access_control()
    return acl_props['acl']


def set_directory_acls(service_client, container_name, directory_name, acl):
    directory_client = service_client.get_directory_client(container_name, directory_name)
    directory_client.set_access_control(acl=acl)


def delete_directory(service_client, container_name, directory_name):
    directory_client = service_client.get_directory_client(container_name, directory_name)
    directory_client.delete_directory()

# Main function to migrate ACLs
def migrate_acls(service_client, container_name, correct_directory, duplicate_directories):
    try:
        correct_acl = get_directory_acls(service_client, container_name, correct_directory)

        for duplicate in duplicate_directories:
            duplicate_acl = get_directory_acls(service_client, container_name, duplicate)

            if duplicate_acl != correct_acl:
                set_directory_acls(service_client, container_name, correct_directory, duplicate_acl)

            delete_directory(service_client, container_name, duplicate)
            print(f"Deleted duplicate folder: {duplicate}")

    except ResourceNotFoundError as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    account_name = "venkat8912"
    account_key = "<Account key>"
    container_name = "test"
    correct_directory = "data"
    duplicate_directories = ["Data", "dAta"]

    service_client = get_data_lake_service_client(account_name, account_key)
    
    migrate_acls(service_client, container_name, correct_directory, duplicate_directories)

输出:

Deleted duplicate folder: Data
Deleted duplicate folder: dAta

enter image description here

参考: 使用 Python 管理 Azure Data Lake Storage 中的 ACL - Azure 存储 |微软学习

© www.soinside.com 2019 - 2024. All rights reserved.