1

我一直在按照 Microsoft 的教程从 SQL Server 数据库增量/增量加载数据。

它使用水印(时间戳)来跟踪自上次以来更改的行。本教程使用管道中的“存储过程”活动将水印存储到 Azure SQL 数据库,以便在下一次执行中重复使用。

拥有一个 Azure SQL 数据库来存储那一点点元信息似乎有点矫枉过正(顺便说一句,我的源数据库是只读的)。我宁愿把它存储在 Azure的其他地方。也许在 blob 存储或其他任何地方。

简而言之:是否有一种简单的方法可以跟踪此类数据,或者我们是否仅限于此使用存储过程(或 Azure Functions 等)?

在此处输入图像描述

4

2 回答 2

1

有一种方法可以通过 Copy Activity 来实现,但是在 'LookupOldWaterMarkActivity' 中获取最新的水印比较复杂,仅供参考。

数据集设置:

在此处输入图像描述

复制活动设置:

源数据集和接收器数据集是同一个数据集。将附加列中的表达式更改为@{activity('LookupNewWaterMarkActivity').output.firstRow.NewWatermarkvalue}

在此处输入图像描述

通过这个,您可以将水印保存为 .txt 文件中的列。但是通过 Lookup 活动很难获得最新的水印。因为您的“LookupOldWaterMarkActivity”输出将是这样的:

{
    "count": 1,
    "value": [
        {
            "Prop_0": "11/24/2020 02:39:14",
            "Prop_1": "11/24/2020 08:31:42"
        }
    ]
}

密钥的名称由 ADF 生成。如果要获取“11/24/2020 08:31:42”,则需要获取列数,然后使用如下表达式:@activity('LookupOldWaterMarkActivity').output.value[0][Prop_(column count - 1)]

如何获取最新水印:

  1. 使用 GetMetadata 活动获取 columnCount 在此处输入图像描述

  2. 使用这个表达式:@activity('LookupOldWaterMarkActivity').output.value[0][concat('Prop_',string(sub(activity('Get Metadata1').output.columnCount,1)))]

于 2020-11-24T09:01:41.487 回答
1

我遇到了一个非常相似的场景,从我发现您无法在 ADF 中存储任何水印信息 - 至少不是以您可以轻松访问的方式。

最后,我刚刚创建了一个基本层 Azure SQL 数据库,将我的水印/配置信息存储在我已经在管道中使用的 SQL 服务器上。

这样做的好处是,当我的解决方案扩展到多个业务部门时,所有业务部门都具有不同的数据库,我仍然可以通过简单地添加一个列来跟踪特定水印信息用于哪个 BU 的列来维护每个业务部门的水印信息。

Blob 存储确实是一个更便宜的选择,但我发现它比仅在现有数据库中使用额外的数据库/表需要更多的努力。

我同意能够在 ADF 本身中为小型配置项维护一个小型数据集非常有用——这可能是向 Microsoft 提出的一个好建议!

于 2020-11-24T02:46:02.207 回答