azure - 在Azure数据工厂中,是否可以使用另一个源中的列来过滤复制事件的源查询?

标签 azure odbc azure-sql-database azure-data-factory

我有一个发票表,11M 行。我想停止每天进行完全刷新并增量加载。我本质上是想更新更改的行并添加新行。

我的想法是创建一个表键并使用它来确定发票行是否已存在于我的接收器中。

案例:源 key 是...

  • 在水槽中:什么都不做
  • 不在接收器中:添加到接收器

案例:水槽 key 是...

  • 不在来源中:删除

想象我要做什么......

enter image description here

但是,我的问题是我的 Source 和 Sink 不是同一类型。源 = ODBC (Hive),接收器 = Azure SQL 数据库。因此,在 ADF 中,您无法加入它们,并且查找的行数限制为 5000 行。

有什么办法可以解决这个问题吗?无论如何要在另一个的Where 子句中使用一个的列吗?

最佳答案

我们可以使用MERGE为了实现这一点。合并语法如下:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE

enter image description here

  1. 我还创建了一个简单的测试。我的源是 Azure 数据湖中的 emp.csv。接收器是我的 Azure SQL。我创建一个表和一个表类型。
CREATE TABLE [dbo].[emp](
    [id] [int] NOT NULL,
    [name] [varchar](20) NULL,
    [age] [int] NULL
)

CREATE TYPE [dbo].[EmpType] AS TABLE(
    [id] [int] NOT NULL,
    [name] [nvarchar](max) NOT NULL,
    [age] [nvarchar](max) NOT NULL
)
GO
  • 然后,我创建存储过程来更新和插入行。这里有一个小问题,azure sql似乎不支持更新操作后的删除操作。所以我定义了另一个专门用于删除操作的存储过程。
  • CREATE PROCEDURE [dbo].[uspEmp]
    
    @emp [dbo].[EmpType] READONLY
    
    AS
            MERGE [dbo].[emp] AS target_sqldb
    
            USING @emp AS source_tblstg
    
            ON target_sqldb.id = source_tblstg.id 
    
            WHEN MATCHED THEN
    
            UPDATE SET
    
            target_sqldb.name = source_tblstg.name,
    
            target_sqldb.age = source_tblstg.age
            
            WHEN NOT MATCHED BY TARGET THEN 
    
            INSERT VALUES (
    
                source_tblstg.id,
    
                source_tblstg.name,
    
                source_tblstg.age
            );
    
            --WHEN NOT MATCHED BY SOURCE THEN
            --DELETE;
    
    
  • 在 ADF 中,我们可以使用Copy Activity1 将行复制到 Azure SQL 中。选择存储的过程,然后点击导入参数enter image description here

  • 然后我们可以使用 Coy Activity2 从 Azure SQL 中删除行。

  • CREATE PROCEDURE [dbo].[deleteEmp]
    
    @emp [dbo].[EmpType] READONLY
    
    AS
            MERGE [dbo].[emp] AS target_sqldb
    
            USING @emp AS source_tblstg
    
            ON target_sqldb.id = source_tblstg.id 
            
            WHEN NOT MATCHED BY SOURCE THEN
            DELETE;
    
    

    同样,选择存储的程序,然后点击导入参数enter image description here

  • 我的测试成功,没有删除源中的行,而是更新并插入了源中的行。
  • 关于azure - 在Azure数据工厂中,是否可以使用另一个源中的列来过滤复制事件的源查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67512274/

    相关文章:

    sql - 在 Azure SQL 数据库中存储 CREATE、TRUNCATE 和 DROP 语句的执行历史记录

    azure - azure 上的 Windows 服务相当于什么?

    azure - 我的 Azure 门户中停用了应用程序中的 mysql 功能

    python - 无法在 Azure - web.config 上部署基本 Python 3.6?

    mysql - 在 MS Access (VBA) 中使用 ADODB 将非 ASCII 插入 MySQL 数据库时出现 "Incorrect string value",但重试有效

    docker - 在 Alpine Linux Docker 容器中安装 ODBC 驱动程序

    python - 在非 Windows 平台(Linux 或 Mac)上使用 Python 处理 Access 数据库

    sql-server - 尽管连接数远低于资源限制,但已达到 Azure Sql 请求限制

    list - 如何列出 Azure Blob 存储中的子目录

    azure - Databricks REST API 返回 HTTP 400 错误(带有 AAD 访问 token )