教程:使用 Transact-SQL 将数据引入 SQL Server 数据池
适用于: SQL Server 2019 (15.x)
重要
Microsoft SQL Server 2019 大数据群集附加产品将停用。 对 SQL Server 2019 大数据群集的支持将于 2025 年 2 月 28 日结束。 具有软件保障的 SQL Server 2019 的所有现有用户都将在平台上获得完全支持,在此之前,该软件将继续通过 SQL Server 累积更新进行维护。 有关详细信息,请参阅公告博客文章和 Microsoft SQL Server 平台上的大数据选项。
本教程演示如何使用 Transact-SQL 将数据加载到 SQL Server 2019 大数据群集 的数据池。 使用 SQL Server 大数据群集,可以跨数据池实例引入和分布来自各种源的数据。
在本教程中,你将了解如何执行以下操作:
- 在数据池中创建外部表。
- 将示例 Web 点击流数据插入到数据池表中。
- 将数据池中的数据与本地表联接在一起。
提示
如果需要,可以下载并运行本教程中的命令脚本。 有关说明,请参阅 GitHub 上的数据池示例。
先决条件
- 大数据工具
- kubectl
- Azure Data Studio
- SQL Server 2019 扩展
- 将示例数据加载到大数据群集中
在数据池中创建外部表
以下步骤将在名为 web_clickstream_clicks_data_pool 的数据池中创建一个外部表。 然后,可以将此表用作将数据引入到大数据群集的位置。
在 Azure Data Studio 中,连接到大数据群集的 SQL Server 主实例。 有关详细信息,请参阅连接到 SQL Server 主实例。
双击“服务器”窗口中的连接,以显示 SQL Server 主实例的服务器仪表板 。 选择“新建查询” 。
运行以下 Transact-SQL 命令,将上下文更改为主实例中的 Sales 数据库。
USE Sales GO
如果尚未创建数据池的外部数据源,请创建该数据源。
IF NOT EXISTS(SELECT * FROM sys.external_data_sources WHERE name = 'SqlDataPool') CREATE EXTERNAL DATA SOURCE SqlDataPool WITH (LOCATION = 'sqldatapool://controller-svc/default');
在数据池中创建一个名为 web_clickstream_clicks_data_pool 的外部表。
IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'web_clickstream_clicks_data_pool') CREATE EXTERNAL TABLE [web_clickstream_clicks_data_pool] ("wcs_user_sk" BIGINT , "i_category_id" BIGINT , "clicks" BIGINT) WITH ( DATA_SOURCE = SqlDataPool, DISTRIBUTION = ROUND_ROBIN );
创建数据池外部表是一项锁定操作。 在所有后端数据池节点上创建指定表后,控制权恢复。 如果在创建操作期间发生故障,便会向调用方返回错误消息。
加载数据
以下步骤使用在先前步骤中创建的外部表将示例 Web 点击流数据引入该数据池。
使用
INSERT INTO
语句将查询结果插入数据池(web_clickstream_clicks_data_pool 外部表)。INSERT INTO web_clickstream_clicks_data_pool SELECT wcs_user_sk, i_category_id, COUNT_BIG(*) as clicks FROM sales.dbo.web_clickstreams_hdfs INNER JOIN sales.dbo.item it ON (wcs_item_sk = i_item_sk AND wcs_user_sk IS NOT NULL) GROUP BY wcs_user_sk, i_category_id HAVING COUNT_BIG(*) > 100;
使用两个 SELECT 查询检查插入的数据。
SELECT count(*) FROM [dbo].[web_clickstream_clicks_data_pool] SELECT TOP 10 * FROM [dbo].[web_clickstream_clicks_data_pool]
查询数据
在包含 Sales 表中本地数据的数据池中,联接查询的存储结果。
SELECT TOP (100)
w.wcs_user_sk,
SUM( CASE WHEN i.i_category = 'Books' THEN 1 ELSE 0 END) AS book_category_clicks,
SUM( CASE WHEN w.i_category_id = 1 THEN 1 ELSE 0 END) AS [Home & Kitchen],
SUM( CASE WHEN w.i_category_id = 2 THEN 1 ELSE 0 END) AS [Music],
SUM( CASE WHEN w.i_category_id = 3 THEN 1 ELSE 0 END) AS [Books],
SUM( CASE WHEN w.i_category_id = 4 THEN 1 ELSE 0 END) AS [Clothing & Accessories],
SUM( CASE WHEN w.i_category_id = 5 THEN 1 ELSE 0 END) AS [Electronics],
SUM( CASE WHEN w.i_category_id = 6 THEN 1 ELSE 0 END) AS [Tools & Home Improvement],
SUM( CASE WHEN w.i_category_id = 7 THEN 1 ELSE 0 END) AS [Toys & Games],
SUM( CASE WHEN w.i_category_id = 8 THEN 1 ELSE 0 END) AS [Movies & TV],
SUM( CASE WHEN w.i_category_id = 9 THEN 1 ELSE 0 END) AS [Sports & Outdoors]
FROM [dbo].[web_clickstream_clicks_data_pool] as w
INNER JOIN (SELECT DISTINCT i_category_id, i_category FROM item) as i
ON i.i_category_id = w.i_category_id
GROUP BY w.wcs_user_sk;
清除
使用以下命令删除本教程中创建的数据库对象。
DROP EXTERNAL TABLE [dbo].[web_clickstream_clicks_data_pool];
后续步骤
了解如何通过 Spark 作业将数据引入到数据池中: