使用 Azure Data Factory 或 Synapse Analytics 向/从 Azure 表存储复制数据

适用于: Azure Data Factory Azure Synapse Analytics

本文概述了如何在 Azure Data Factory 和 Synapse Analytics 管道中使用复制活动来将数据复制到 Azure 表存储以及从中复制数据。 本文是根据总体概述复制活动的复制活动概述一文编写的。

注意

建议使用 Azure Az PowerShell 模块与Azure交互。 请参阅 Install Azure PowerShell 入门。 若要了解如何迁移到 Az PowerShell 模块,请参阅 Migrate Azure PowerShell从 AzureRM 迁移到 Az。

支持的功能

此Azure表存储连接器支持以下功能:

支持的功能 IR 托管私有终结点
Copy activity (源/接收器) (1) (2) ✓ 排除存储帐户 V1
查询活动 (1) (2) ✓ 排除存储帐户 V1

(1) Azure集成运行时 (2) 自承载集成运行时

可将数据从任一支持的源数据存储复制到表存储。 也可以将数据从表存储复制到任一支持的接收器数据存储。 有关复制活动支持作为源或接收器的数据存储列表,请参阅支持的数据存储表。

具体而言,此Azure表连接器支持使用帐户密钥和服务共享访问签名身份验证复制数据。

开始

若要使用管道执行复制活动,可以使用以下工具或 SDK 之一:

使用 UI 创建 Azure 表存储关联服务

使用以下步骤在Azure门户 UI 中创建Azure表存储链接服务。

  1. 浏览到Azure Data Factory或 Synapse 工作区中的“管理”选项卡并选择“链接服务”,然后单击“新建”:

  2. 搜索Azure Table并选择该Azure Table存储连接器。

    Azure 表存储连接器的屏幕截图。

  3. 配置服务详细信息、测试连接并创建新的链接服务。

    Azure 表存储链接服务的配置截图。

连接器配置详细信息

以下部分提供有关用于定义特定于Azure表存储的实体的属性的详细信息。

连接的服务属性

此Azure Table Storage连接器支持以下身份验证类型。 有关详细信息,请参阅相应部分。

帐户密钥身份验证

可以使用帐户密钥创建Azure Storage链接服务。 该服务可以全球访问存储。 支持以下属性。

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage。 是
connectionString 为 connectionString 属性指定连接到存储所需的信息。
还可以将帐户密钥放在Azure Key Vault中,并从connection string中拉取 accountKey 配置。 有关更多详细信息,请参阅以下示例和文章《在 Azure Key Vault 中存储凭据》。
是
connectVia 用于连接到数据存储的集成运行时。 可以使用 Azure Integration Runtime 或自托管 Integration Runtime(如果数据存储位于专用网络中)。 如果未指定,则使用默认Azure Integration Runtime。 否

注意

如果使用的是“AzureStorage”类型链接服务,它仍然按原样受支持,但建议你今后使用此新的“AzureTableStorage”链接服务类型。

示例:

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {
            "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountname>;AccountKey=<accountkey>;EndpointSuffix=core.chinacloudapi.cn"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例:将存储帐户密钥存储在 Azure Key Vault 中

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {
            "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountname>;EndpointSuffix=core.chinacloudapi.cn",
            "accountKey": { 
                "type": "AzureKeyVaultSecret", 
                "store": { 
                    "referenceName": "<Azure Key Vault linked service name>", 
                    "type": "LinkedServiceReference" 
                }, 
                "secretName": "<secretName>" 
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

共享访问签名身份验证

还可以使用共享访问签名创建存储链接服务。 共享访问签名会为该服务提供对存储中所有/特定资源的受限/限时访问权限。

共享访问签名对存储帐户中的资源提供委托访问。 可以使用共享访问签名授权客户端在指定时间内,以一组指定权限有限访问存储帐户中的对象。 无需共享帐户访问密钥。 共享访问签名是一个 URI,在其查询参数中包含对存储资源已验证访问所需的所有信息。 若要使用共享访问签名访问存储资源,客户端只需将共享访问签名传入到相应的构造函数或方法。 有关共享访问签名的详细信息,请参阅共享访问签名:了解共享访问签名模型。

注意

现在支持服务共享访问签名和帐户共享访问签名。 有关共享访问签名的详细信息,请参阅 使用共享访问签名 (SAS) 限制对Azure Storage资源的访问权限。

提示

若要为存储帐户生成服务共享访问签名,可以执行以下 PowerShell 命令。 请替换占位符并授予所需的权限。 $context = New-AzStorageContext -StorageAccountName <accountName> -StorageAccountKey <accountKey> -Endpoint chinacloudapi.cn New-AzStorageContainerSASToken -Name <containerName> -Context $context -Permission rwdl -StartTime <startTime> -ExpiryTime <endTime> -FullUri

若要使用共享访问签名身份验证,需支持以下属性。

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage。 是
sasUri 将表的共享访问签名 URI 指定为 SAS URI。
将此字段标记为 SecureString 以安全存储它。 还可以将 SAS 令牌置于Azure Key Vault中,以利用自动轮换并删除令牌部分。 有关更多详细信息,请参阅以下示例和文章《在 Azure Key Vault 中存储凭据》。
是
connectVia 用于连接到数据存储的集成运行时。 可以使用 Azure 集成运行时或自托管集成运行时(如果数据存储位于专用网络中的情况下)。 如果未指定,则使用默认Azure Integration Runtime。 否

注意

如果使用的是“AzureStorage”类型链接服务,它仍然按原样受支持,但建议你今后使用此新的“AzureTableStorage”链接服务类型。

示例:

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {
            "sasUri": {
                "type": "SecureString",
                "value": "<SAS URI of the Azure Storage resource e.g. https://<account>.table.core.chinacloudapi.cn/<table>?sv=<storage version>&amp;st=<start time>&amp;se=<expire time>&amp;sr=<resource>&amp;sp=<permissions>&amp;sip=<ip range>&amp;spr=<protocol>&amp;sig=<signature>>"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

示例:将存储帐户密钥存储在 Azure Key Vault 中

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {
            "sasUri": {
                "type": "SecureString",
                "value": "<SAS URI of the Azure Storage resource without token e.g. https://<account>.table.core.chinacloudapi.cn/<table>>"
            },
            "sasToken": { 
                "type": "AzureKeyVaultSecret", 
                "store": { 
                    "referenceName": "<Azure Key Vault linked service name>", 
                    "type": "LinkedServiceReference" 
                }, 
                "secretName": "<secretName>" 
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

在创建共享访问签名 URI 时,请注意以下几点:

  • 根据链接服务(读取、写入、读/写)的用法,设置针对对象的适当读/写权限。
  • 根据需要设置“到期时间”。 确保存储对象的访问权限不会在管道的活动期限内过期。
  • 应当根据需要在合适的表级别创建 URI。

系统分配的托管身份验证

数据工厂或 Synapse 管道可与用于 Azure 资源的系统分配的托管标识相关联,该标识表示该资源用于向其他 Azure 服务进行身份验证。 可以使用此系统分配的托管标识进行Azure Table Storage身份验证。 若要了解有关Azure资源的托管标识的详细信息,请参阅 Azure 资源的托管标识

若要使用系统分配的托管标识身份验证,请执行以下步骤:

  1. 通过复制随工厂或 Synapse 工作区一起生成的系统分配的托管标识对象 ID 的值,检索系统分配的托管标识信息。

  2. 在 Azure Table Storage 中授予托管标识权限。 有关角色的详细信息,请查看此文章。

    • 作为源,在“访问控制(IAM)”中,至少授予“存储表数据读取者”角色。
    • 作为接收器,在“访问控制 (IAM)”中,至少授予存储表数据贡献者角色。

Azure Table Storage链接服务支持这些属性:

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage。 是
serviceEndpoint 使用 https://<accountName>.table.core.chinacloudapi.cn/ 模式指定Azure Table Storage服务终结点。 是
connectVia 用于连接到数据存储的集成运行时。 可以使用Azure Integration Runtime。 如果未指定,则使用默认Azure Integration Runtime。 否

注意

仅Azure集成运行时支持系统分配的托管标识身份验证。

示例:

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {            
            "serviceEndpoint": "https://<accountName>.table.core.chinacloudapi.cn/"
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

用户分配的托管标识身份验证

可以为数据工厂分配一个或多个用户分配的托管标识。 可以使用此用户分配的托管标识进行Azure Table Storage身份验证,以便从/向Azure Table Storage访问和复制数据。 若要了解有关Azure资源的托管标识的详细信息,请参阅 Azure 资源的托管标识

若要使用用户分配的托管标识身份验证,请执行以下步骤:

  1. 创建一个或多个用户分配的托管标识并在Azure Table Storage中授予权限。 有关角色的详细信息,请查看此文章。

    • 作为源,在“访问控制(IAM)”中,至少授予“存储表数据读取者”角色。
    • 作为接收器,在“访问控制 (IAM)”中,至少授予存储表数据贡献者角色。
  2. 为数据工厂分配一个或多个用户分配的托管标识,并为每个用户分配的托管标识创建凭据。

Azure Table Storage链接服务支持这些属性:

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage。 是
serviceEndpoint 使用 https://<accountName>.table.core.chinacloudapi.cn/ 模式指定Azure Table Storage服务终结点。 是
凭据 将用户分配的托管标识指定为凭据对象。 是
connectVia 用于连接到数据存储的集成运行时。 可以使用 Azure 集成运行时或自托管集成运行时(如果数据存储位于专用网络中的情况下)。 如果未指定,则使用默认Azure Integration Runtime。 否

示例:

{
    "name": "AzureTableStorageLinkedService",
    "properties": {
        "type": "AzureTableStorage",
        "typeProperties": {            
            "serviceEndpoint": "https://<accountName>.table.core.chinacloudapi.cn/",
            "credential": {
                "referenceName": "credential1",
                "type": "CredentialReference"
            }
        },
        "connectVia": {
            "referenceName": "<name of Integration Runtime>",
            "type": "IntegrationRuntimeReference"
        }
    }
}

数据集属性

有关可用于定义数据集的各部分和属性的完整列表,请参阅数据集一文。 本部分提供Azure表数据集支持的属性列表。

若要向/从 Azure 表复制数据,请将数据集的 type 属性设置为 AzureTable。 支持以下属性。

属性 描述 必需
类型 数据集的 type 属性必须设置为 AzureTable。 是
tableName 链接服务引用的表存储数据库实例中表的名称。 是

示例:

{
    "name": "AzureTableDataset",
    "properties":
    {
        "type": "AzureTable",
        "typeProperties": {
            "tableName": "MyTable"
        },
        "schema": [],
        "linkedServiceName": {
            "referenceName": "<Azure Table storage linked service name>",
            "type": "LinkedServiceReference"
        }
    }
}

由服务进行的架构推理

对于无架构数据存储(如 Azure 表),服务通过以下方式之一推断架构:

  • 如果在复制活动中指定列映射,服务会使用源端列列表来检索数据。 在这种情况下,如果某行没有某列的值,则会为其提供一个 null 值。
  • 如果未在复制活动中指定列映射,服务会使用数据中的第一行来推断架构。 在这种情况下,如果第一行不包含完整架构(例如某些列具有 null 值),则复制操作的结果中会丢失部分列。

复制活动 属性

有关可用于定义活动的各部分和属性的完整列表,请参阅管道一文。 本部分提供Azure表源和接收器支持的属性列表。

Azure Table作为源类型

若要从 Azure 表中复制数据,请将复制活动中的源类型设置为 AzureTableSource。 复制活动的 source 节支持以下属性。

属性 描述 必需
类型 复制活动源的 type 属性必须设置为 AzureTableSource。 是
azureTableSourceQuery(Azure 表格源查询) 使用自定义表存储查询读取数据。
源查询是从 Azure Table Storage 支持的 $filter 查询选项直接映射,详细了解 此文档中的语法,并参阅以下 azureTableSourceQuery 示例部分中的示例。
否
azureTableSource忽略表未找到 指示是否允许表不存在的异常。
允许的值为 True 和 False(默认值)。
否

azureTableSourceQuery 示例

注意

Azure表查询操作在 30 秒内超时,由Azure表服务强制执行。 通过针对查询的设计一文了解如何优化查询。

如果要根据日期/时间类型列筛选数据,请参阅以下示例:

"azureTableSourceQuery": "LastModifiedTime gt datetime'2017-10-01T00:00:00' and LastModifiedTime le datetime'2017-10-02T00:00:00'"

如果要根据字符串类型列筛选数据,请参阅以下示例:

"azureTableSourceQuery": "LastModifiedTime ge '201710010000_0000' and LastModifiedTime le '201710010000_9999'"

如果使用管道参数,请根据之前的示例将日期时间值转换为正确格式。

Azure表作为接收器类型

若要将数据复制到 Azure 表,请将复制活动中的接收器类型设置为 AzureTableSink。 复制活动 sink 节中支持的属性有以下这些。

属性 描述 必需
类型 复制活动接收器的 type 属性必须设置为 AzureTableSink。 是
azure表默认分区键值 接收器可以使用的默认分区键值。 否
azureTablePartitionKeyName (Azure 表格分区键名) 指定列名称,使用列值作为分区键。 如果未指定,则使用“AzureTableDefaultPartitionKeyValue”作为分区键。 否
azureTableRowKeyName 指定列的名称,其列值将用作行键。 如果未指定,对每一行使用 GUID。 否
azureTableInsertType(Azure 表插入类型) 将数据插入Azure表中的模式。 此属性控制输出表中具有匹配的分区键和行键的现有行,其值是被替换还是合并。

允许的值为 merge(默认值)和 replace。

此设置在行级别而不是表级别进行应用。 并且两个选项都不会删除输入中不存在的输出表中的行。 若要了解合并和替换设置的工作原理,请参阅插入或合并实体和插入或替换实体。
否
writeBatchSize 达到 writeBatchSize 或 writeBatchTimeout 时,将数据插入 Azure 表中。
允许的值为 integer(行数)。
否(默认值为 10,000)
writeBatchTimeout 达到 writeBatchSize 或 writeBatchTimeout 时,将数据插入 Azure 表中。
允许的值为时间跨度。 例如“00:20:00”(20 分钟)。
否(默认值为 90 秒,即存储客户端的默认超时)
 最大并发连接数 活动运行期间与数据存储建立的并发连接的上限。 仅在要限制并发连接时指定一个值。  无

示例:

"activities":[
    {
        "name": "CopyToAzureTable",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<Azure Table output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "AzureTableSink",
                "azureTablePartitionKeyName": "<column name>",
                "azureTableRowKeyName": "<column name>"
            }
        }
    }
]

azureTablePartitionKeyName (Azure 表格分区键名)

通过使用 "translator" 属性将源列映射到目标列,然后才能将目标列用作 azureTablePartitionKeyName。

在以下示例中,源列 DivisionID 映射到目标列 DivisionID:

"translator": {
    "type": "TabularTranslator",
    "columnMappings": "DivisionID: DivisionID, FirstName: FirstName, LastName: LastName"
}

“DivisionID”指定为分区键。

"sink": {
    "type": "AzureTableSink",
    "azureTablePartitionKeyName": "DivisionID"
}

Azure 表的数据类型映射

将数据复制到 Azure 表或从 Azure 表复制数据时,会使用以下映射,将 Azure 表数据类型转换为服务内部使用的临时数据类型。 若要了解复制活动如何将源架构和数据类型映射到接收器,请参阅架构和数据类型映射。

当您将数据移入和移出 Azure 表时,Azure Table 定义的以下 映射用于从 Azure 表 OData 类型到 .NET 类型的转换,反之亦然。

Azure 表数据类型 临时服务数据类型 详细信息
Edm.Binary byte[] 一个字节数组,最大 64 KB。
Edm.Boolean 布尔 一个布尔值。
Edm.DateTime 日期时间 一个 64 位值,用协调世界时 (UTC) 表示。 支持的 DateTime 范围从 UTC 时间 1601 年 1 月 1 日午夜开始。 该范围到 9999 年 12 月 31 日结束。
Edm.Double 双精度 64 位浮点值。
Edm.Guid Guid 128 位全局唯一标识符。
Edm.Int32 Int32 32 位整数。
Edm.Int64 Int64 64 位整数。
Edm.String 字符串 UTF-16 编码值。 字符串值最大可以为 64 KB。

查找活动属性

若要了解有关属性的详细信息,请查看 Lookup 活动。

有关复制活动支持作为源和接收器的数据存储的列表,请参阅受支持的数据存储。