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



我需要一些帮助。。我有3个外部表格:

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表:

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中有比titanic中更多独特的PassengerId,但我需要两张表中的所有PassengerId都在一列中。。两个表中的Pclass相同。。。这困扰着我

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

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

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

这是我能找到的最好的:

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

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

  1. 没有3个具有不同列的外部表需要连接
  2. 没有更新,所以可以在创建表之后使用。(据我所知,更新不能与外部表一起使用(
  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的工作方式是将所有数据加载到Temp表中,然后将其合并到dbo.titanic
  2. 如果表没有相同的ID,但您需要所有的ID,请执行左/右联接
  3. 使用以下代码,即可轻松创建SP:;WITH〔MyCTE〕AS(SELECT…(UPDATE dbo.titanic SET
  4. 您无法使用Polybase进行更新,您必须创建一个新文件,即titanic4.csv,该文件已连接记录

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

我得到了这个。。。

这可能不是最优雅的方式,但它很有效。。使用左联接,并添加stg.titanic表(与dbo.titanic相同(,该表组合了3个外部表。。然后合并stg。和dbo。表。。

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
);

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

谢谢。

最新更新