1

我正在使用 Python 3.8 和 Azure 数据湖 Gen 2。我想为保存在数据湖上的文件设置过期时间。在此之后 - azure.datalake.store.core.AzureDLFileSystem 类 | Microsoft Docs,我尝试了以下

            file_client = directory_client.create_file(filename)
            file_client.upload_data(
                data,
                overwrite=True
            )
            ts = time.time() + 100
            file_client.set_expiry(path=path, expire_time=ts)

但我得到了错误

AttributeError: 'DataLakeFileClient' object has no attribute 'set_expiry'

在数据湖上创建文件时设置过期时间的正确方法是什么?

4

1 回答 1

2

您的错误的原因是您似乎试图调用属于azure.datalake.store.core.AzureDLFileSystemtype 对象的方法DataLakeFileClient。这就是你得到错误的原因!类型的对象不存在该方法DataLakeFileClient

如果你想调用 set_expiry 的方法,你必须首先创建正确的对象类型。

例如在 Gen1 中,首先创建对象,如下所述:

https://docs.microsoft.com/en-us/azure/data-lake-store/data-lake-store-data-operations-python

## Declare variables
subscriptionId = 'FILL-IN-HERE'
adlsAccountName = 'FILL-IN-HERE'

## Create a filesystem client object
adlsFileSystemClient = core.AzureDLFileSystem(adlCreds, store_name=adlsAccountName)

使用此对象,您可以调用

adlsFileSystemClient 与您在代码示例中的完全一样。

set_expiry(path, expiry_option, expire_time=None)

只要确保您尝试在正确类型的对象上调用方法即可。

对于第 2 代:

from azure.storage.filedatalake import DataLakeServiceClient
datalake_service_client = DataLakeServiceClient.from_connection_string(self.connection_string)

# Instantiate a FileSystemClient
file_system_client = datalake_service_client.get_file_system_client("mynewfilesystem")

对于 Gen2,您需要将 blob 设置为过期,如下所示:https ://docs.microsoft.com/en-us/azure/storage/blobs/storage-lifecycle-management-concepts?tabs=azure-portal#expire-基于年龄的数据

根据年龄过期数据

某些数据预计会在创建后数天或数月过期。您可以配置生命周期管理策略以根据数据年龄通过删除使数据过期。以下示例显示了删除所有超过 365 天的块 blob 的策略。

{
  "rules": [
    {
      "name": "expirationRule",
      "enabled": true,
      "type": "Lifecycle",
      "definition": {
        "filters": {
          "blobTypes": [ "blockBlob" ]
        },
        "actions": {
          "baseBlob": {
            "delete": { "daysAfterModificationGreaterThan": 365 }
          }
        }
      }
    }
  ]
}
于 2020-08-30T06:21:58.010 回答