首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Azure Data中,是否可以使用来自另一个Source的列来过滤副本活动的Source查询?

在Azure Data中,是否可以使用来自另一个Source的列来过滤副本活动的Source查询?
EN

Stack Overflow用户
提问于 2021-05-12 23:40:23
回答 2查看 1.7K关注 0票数 1

我有一个开发票的桌子,1100万行。我不想每天都做全面的刷新,而是以增量方式加载。实际上,我希望更新已更改的行并添加新行。

我的想法是创建一个表键,并使用它来确定发票行是否已经出现在我的水槽中。

案例:源密钥是..。

  • 在水池里:什么也不做
  • 不在水槽中:加入水槽

案例:水槽钥匙是..。

  • 资料来源:删除

来想象我想要的..。

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

有办法解决这个问题吗?无论如何,在另一个语句的Where子句中使用一个列吗?

EN

回答 2

Stack Overflow用户

发布于 2021-05-13 06:01:08

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

代码语言:javascript
复制
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

  1. 我还创建了一个简单的测试。我的来源是我的Azure数据湖中的emp.csv。接收器是我的Azure SQL。我创建一个表和一个表类型。
代码语言:javascript
复制
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
  1. 然后创建用于更新和插入行的存储过程。这里有一个小问题,azure sql似乎不支持update操作后的delete操作。因此,我定义了另一个专用于删除操作的存储过程。
代码语言:javascript
复制
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;
  1. 在ADF中,我们可以使用Copy activity1将行复制到Azure中。选择存储的prcedure并单击Import parameter
  1. 然后我们可以使用Coy activity2从Azure中删除行。
代码语言:javascript
复制
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;

同样,选择存储的prcedure并单击Import parameter

  1. 我的测试是成功的,没有删除源代码中的任何行,在源中更新和插入行。
票数 3
EN

Stack Overflow用户

发布于 2021-05-13 05:58:15

您可以加入它们,并在ADF中筛选和查找。但你想在复制活动中做到这一点。这正是为数据流活动创建的用例类型:https://www.youtube.com/watch?v=GACpvMjOJgE

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67512274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档