Compartilhar via

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

适用于: Azure 数据工厂 Azure Synapse Analytics

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

注意

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

支持的功能

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

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

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

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

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

开始

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

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

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

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

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

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

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

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

连接器配置详细信息

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

连接的服务属性

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

帐户密钥身份验证

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

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage
connectionString 为 connectionString 属性指定连接到存储所需的信息。
还可以将帐户密钥放在Azure 密钥保管库中,并从连接字符串中拉取 accountKey 配置。 有关更多详细信息,请参阅以下示例和文章《在 Azure 密钥保管库 中存储凭据》。
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 密钥保管库 中

{
    "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 存储资源的访问权限。

提示

若要为存储帐户生成服务共享访问签名,可以执行以下 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 密钥保管库中,以利用自动轮换并删除令牌部分。 有关更多详细信息,请参阅以下示例和文章《在 Azure 密钥保管库 中存储凭据》。
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 密钥保管库 中

{
    "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 表存储身份验证。 若要了解有关Azure资源的托管标识的详细信息,请参阅 Azure 资源的托管标识

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

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

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

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

Azure 表存储链接服务支持这些属性:

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage
serviceEndpoint 使用 https://<accountName>.table.core.chinacloudapi.cn/ 模式指定Azure 表存储服务终结点。
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 表存储身份验证,以便从/向Azure 表存储访问和复制数据。 若要了解有关Azure资源的托管标识的详细信息,请参阅 Azure 资源的托管标识

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

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

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

Azure 表存储链接服务支持这些属性:

属性 描述 必需
类型 type 属性必须设置为 AzureTableStorage
serviceEndpoint 使用 https://<accountName>.table.core.chinacloudapi.cn/ 模式指定Azure 表存储服务终结点。
凭据 将用户分配的托管标识指定为凭据对象。
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 表存储 支持的 $filter 查询选项直接映射,详细了解 此文档中的语法,并参阅以下 azureTableSourceQuery 示例部分中的示例。
azureTableSource忽略表未找到 指示是否允许表不存在的异常。
允许的值为 TrueFalse(默认值)。

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>"
            }
        }
    }
]

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 活动

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