【问题标题】:ADF Pipeline Adding Sequential Value in Copy ActivityADF 管道在复制活动中添加顺序值
【发布时间】:2021-03-26 00:55:35
【问题描述】:

如果在其他地方提出并回答了这个问题,我们深表歉意。如果是,请在回复中参考 cmets 中的 url。情况就是这样,

我正在发出 API 请求,作为响应,我得到了 auth_token,我在 Copy Activity 中使用它作为授权来检索 JSON 格式的数据并将其接收到 Azure SQL 数据库。我能够将我在 JSON 中收到的所有元素映射到 Azure SQL 数据库的列。但是,仍有两列(UploadIdRowId)需要填充。

  • UploadId 是一个 GUID,对于整批行都是相同的(我已经设法解决了这个问题)
  • RowId 将是一个序列,从 1 开始到该批次条目的结尾,然后对于下一个批次(使用新的 GUID 值),它会重置回 1。

数据库看起来像这样,

| APILoadTime |      UploadId     |    RowId    |
|  2020-02-01 | 29AD7-12345-22EwQ |      1      |
|  2020-02-01 | 29AD7-12345-22EwQ |      2      |
|  2020-02-01 | 29AD7-12345-22EwQ |      3      |
|  2020-02-01 | 29AD7-12345-22EwQ |      4      |
|  2020-02-01 | 29AD7-12345-22EwQ |      5      |
--------------------------------------------------> End of Batch One / Start of Batch Two
|  2020-02-01 | 30AD7-12345-22MLK |      1      |
|  2020-02-01 | 30AD7-12345-22MLK |      2      |
|  2020-02-01 | 30AD7-12345-22MLK |      3      |
|  2020-02-01 | 30AD7-12345-22MLK |      4      |
|  2020-02-01 | 30AD7-12345-22MLK |      5      |
--------------------------------------------------> End of Batch Two and so on ... 

Azure Pipeline 的 Copy Activity 中是否有办法实现此 RowId 行为...或者即使在 Azure SQL 数据库中也可以。

对于冗长的描述表示歉意,并提前感谢您的帮助! 问候

【问题讨论】:

  • 数据流能做到吗?
  • 好点@LeonYue,过程是Copy Activity直接存储到Table中,一旦下沉,就会运行Data Flow将数据转换并下沉到辅助表(称为TransformedTable)。也许我可以做到这一点,但是 DataFlow 中是否有我可以用来实现这一目标的活动?谢谢
  • 我试过了,恐怕没有主动可以在数据工厂或数据流中实现。

标签: azure azure-sql-database azure-data-factory copy-activity


【解决方案1】:

您需要使用窗口函数来实现这一点。 ADF 数据流有 Window Transformation activities 专门用于执行此操作。

否则,您可以将数据加载到临时表中,然后在选择时将其 use Azure SQL to window the data...

SELECT
    APILoadTime
    ,UploadId
    ,ROW_NUMBER() OVER (PARTITION BY UploadId ORDER BY APILoadTime) AS RowId
FROM dbo.MyTable;

【讨论】:

    【解决方案2】:

    非常感谢@Leon Yue 和@JeffRamos,我已经找到了解决方案,所以在这里发布给其他可能遇到相同情况的人,

    我找到的解决方案是在 Azure 数据工厂中使用 存储过程,我从这里调用 Azure 数据流活动。这是我用于创建 RowId 种子函数的代码,

    CREATE PROCEDURE resetRowId
    AS
    BEGIN
        DBCC CHECKIDENT ('myDatabase', RESEED, 0)
    END
    GO
    

    一旦我有了这个存储过程,我所做的就是这样,

    这是为你做的,我将它保留为 0 的原因是,当新数据进来时,它会再次从 1 开始......

    希望这对其他人也有帮助...

    感谢所有帮助过的人

    【讨论】:

    • 啊。在这种情况下,您也可以在 Copy 活动的 Sink 选项卡的“Pre-copy script”字段中完成“TRUNCATE TABLE dbo.MyTable”。很高兴无论哪种方式都能解决。
    • 截断不会丢失所有现有数据吗?!?
    • 正确,它也会删除数据。看来您正在批量迭代每个负载,这就是我建议的原因。通常身份列是 PK 或至少是唯一的,但我想我知道你是如何让它满足你的需要的。聪明的。我仍然建议查看前面提到的窗口函数。他们将允许您在不依赖标识列的情况下执行此类操作。 ROW_NUMBER 也只是窗口函数之一。他们很漂亮。
    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2019-12-26
    • 2022-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 1970-01-01
    相关资源
    最近更新 更多