使用 Polybase 和存储过程从多个外部表更新 dbo.table

using Polybase and Stored procedure for updating dbo.table from several external tables

我需要一些帮助.. 我有 3 个外部 tables:

create external table ext.titanic
(
PassengerId INT,
Pclass INT,
Pname VARCHAR(100),
Gender VARCHAR(20),
Ticket VARCHAR(30),
Cabin VARCHAR(30)
)
WITH (LOCATION='/titanic.csv',
    DATA_SOURCE = blob1,  
    FILE_FORMAT = TextFileFormat1,
);

create external table ext.titanic2
(
Pclass INT,
Pname VARCHAR(100)
)
WITH (LOCATION='/titanic2.csv',
    DATA_SOURCE = blob1,  
    FILE_FORMAT = TextFileFormat1,
);

create external table ext.titanic3
(
PassengerId INT,
Pname VARCHAR(100),
)
WITH (LOCATION='/titanic3.csv',
    DATA_SOURCE = blob1,  
    FILE_FORMAT = TextFileFormat1,
);

并且我创建了 dbo table:

CREATE TABLE dbo.titanic
WITH
(
    DISTRIBUTION = ROUND_ROBIN
)
AS

SELECT 

titanic.PassengerId,
titanic.Pclass,
titanic.Pname,
titanic.Gender,
titanic.Ticket,
titanic.Cabin,
titanic3.PassengerId as T3_PassengerId,
titanic3.Pname as T3_Pname,
titanic2.Pclass as T2_Pclass,
titanic2.Pname as T2_Pname

FROM ext.titanic
FULL JOIN ext.titanic2 ON ext.titanic2.PassengerId=ext.titanic.PassengerId
FULL JOIN ext.titanic3 ON ext.titanic3.Pclass=ext.titanic.Pclass;

我必须加入他们并使用存储过程更新 dbo.titanic

我是否需要额外的 ext.table 来加入他们,然后再与 dbo.titanic 合并?

或者有简单易行的方法吗?

我还需要更多帮助 dbo.titanic 并加入..

titanic3 中的唯一 PassengerId 比 titanic 中的多, 但我需要来自 2 tables 的所有 PassengerIds 都在一列中.. 来自两个 tables 的 Pclass 相同......这让我很烦

仅供参考 - titanic table 有大约 100000 行(800 个唯一的 PassengerID),titanic2 和 titanic3 有 5000 个唯一(总)行的 PassengerId 和 Pclass。

最后的 table 必须看起来像 dbo.titanic 但没有 T3_PassengerId 和 T2_Pclass 因为它们必须以某种方式合并到 PassengerId 和 Pclass 中。

我花了很多时间寻找类似的东西,但没有找到足够接近的东西。

这是我能找到的最好的:

https://www.sqlservercentral.com/articles/access-external-data-from-azure-synapse-analytics-using-polybase

我要感谢写这篇文章的人, 但是要使用它,我有 3 个主要问题:

  1. 没有 3 个外部 table 需要加入不同的列
  2. 没有更新,因此可以在创建 tables 后使用。(据我所知,更新不能与外部 tables 一起使用)
  3. 没有用于此更新的存储过程。

我可以用这样的东西吗

INSERT INTO table1(column1, column2,...) SELECT column1, column2,... FROM table2 WHERE condition( compare value in table1 <> value in table 2)

提前致谢

  1. 您不能创建另一个 ext.table; Polybase 的工作方式是它将所有数据加载到临时表,然后可以合并到 dbo.titanic.
  2. 如果表的 ID 不同但您需要所有 ID,则执行 left/right 连接。
  3. 使用下面的代码,那么创建SP就很简单了: ;WITH [MyCTE] AS (SELECT ...) 更新 dbo.titanic SET ...;
  4. 您无法使用 Polybase 进行更新,您必须创建一个新文件,即 titanic4.csv,其中包含已加入的记录。

请尝试更新您的进度,以便我进一步帮助您。

我明白了...

可能不是最优雅的方式,但它有效.. 使用 left join,附加 stg.titanic table(与 dbo.titanic) 结合了 3 个外部 tables.. 然后合并 stg.和 dbo。 tables..

MERGE dbo.titanic AS [Target]
USING (SELECT 
 column1,2,3
  UpdateTime
 from stg.titanic) AS [Source] 
 ON [Target].PassengerId = [Source].PassengerId 
 and [Target].Pclass = [Source].Pclass 
 and [Target].Pname = [Source].Pname --- specifies the condition
WHEN MATCHED THEN
 UPDATE SET [Target].UpdateTime = GetDate()  
WHEN NOT MATCHED THEN
INSERT (column1,2,3 --- when one of the 3 conditions is not met then insert new row
 UpdateTime)
VALUES (
  [Source].column1,2,3
  [Source].UpdateTime
);

如果有人知道更好的方法与我们分享会很好

谢谢。