使用 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 中。
我花了很多时间寻找类似的东西,但没有找到足够接近的东西。
这是我能找到的最好的:
我要感谢写这篇文章的人,
但是要使用它,我有 3 个主要问题:
- 没有 3 个外部 table 需要加入不同的列
- 没有更新,因此可以在创建 tables 后使用。(据我所知,更新不能与外部 tables 一起使用)
- 没有用于此更新的存储过程。
我可以用这样的东西吗
INSERT INTO table1(column1, column2,...) SELECT column1, column2,... FROM table2 WHERE condition( compare value in table1 <> value in table 2)
提前致谢
- 您不能创建另一个 ext.table; Polybase 的工作方式是它将所有数据加载到临时表,然后可以合并到 dbo.titanic.
- 如果表的 ID 不同但您需要所有 ID,则执行 left/right 连接。
- 使用下面的代码,那么创建SP就很简单了:
;WITH [MyCTE] AS (SELECT ...) 更新 dbo.titanic SET ...;
- 您无法使用 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
);
如果有人知道更好的方法与我们分享会很好
谢谢。
我需要一些帮助.. 我有 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 中。
我花了很多时间寻找类似的东西,但没有找到足够接近的东西。
这是我能找到的最好的:
我要感谢写这篇文章的人, 但是要使用它,我有 3 个主要问题:
- 没有 3 个外部 table 需要加入不同的列
- 没有更新,因此可以在创建 tables 后使用。(据我所知,更新不能与外部 tables 一起使用)
- 没有用于此更新的存储过程。
我可以用这样的东西吗
INSERT INTO table1(column1, column2,...) SELECT column1, column2,... FROM table2 WHERE condition( compare value in table1 <> value in table 2)
提前致谢
- 您不能创建另一个 ext.table; Polybase 的工作方式是它将所有数据加载到临时表,然后可以合并到 dbo.titanic.
- 如果表的 ID 不同但您需要所有 ID,则执行 left/right 连接。
- 使用下面的代码,那么创建SP就很简单了: ;WITH [MyCTE] AS (SELECT ...) 更新 dbo.titanic SET ...;
- 您无法使用 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
);
如果有人知道更好的方法与我们分享会很好
谢谢。