Synapse SQL 提供的 CETAS

可在专用 SQL 池或无服务器 SQL 池中使用 CREATE EXTERNAL TABLE AS SELECT (CETAS) 来完成以下任务:

  • 创建外部表

  • 将 Transact-SQL SELECT 语句的结果并行导出到:

    • Hadoop
    • Azure 存储 Blob
    • Azure Data Lake Storage Gen2

专用 SQL 池中的 CETAS

对于专用 SQL 池的 CETAS 用法和语法,请查看 CREATE EXTERNAL TABLE AS SELECT 一文。 此外,有关使用专用 SQL 池的 CTAS 的指导,请参阅 CREATE TABLE AS SELECT 一文。

无服务器 SQL 池的 CETAS

使用无服务器 SQL 池时,CETAS 用来创建外部表,并将查询结果导出到 Azure 存储 Blob 或 Azure Data Lake Storage Gen2。

有关完整语法,请参阅 CREATE EXTERNAL TABLE AS SELECT (Transact-SQL)

示例

这些示例使用 CETAS 将按年份和州聚合的总人口保存到 population_ds 数据源中的 aggregated_data 文件夹。

此示例依赖于先前创建的凭据、数据源和外部文件格式。 请参阅外部表文档。 若要将查询结果保存到同一数据源中的其他文件夹,请更改 LOCATION 参数。

若要将结果保存到不同的存储帐户,请为 DATA_SOURCE 参数创建并使用一个不同的数据源。

注意

下面的示例使用公共 Azure 开放式数据存储帐户。 它是只读的。 若要执行这些查询,需要提供你具有写入权限的数据源。

-- use CETAS to export select statement with OPENROWSET result to  storage
CREATE EXTERNAL TABLE population_by_year_state
WITH (
    LOCATION = 'aggregated_data/',
    DATA_SOURCE = population_ds,  
    FILE_FORMAT = census_file_format
)  
AS
SELECT decennialTime, stateName, SUM(population) AS population
FROM
    OPENROWSET(BULK 'https://azureopendatastorage.dfs.core.windows.net/censusdatacontainer/release/us_population_county/year=*/*.parquet',
    FORMAT='PARQUET') AS [r]
GROUP BY decennialTime, stateName
GO

-- you can query the newly created external table
SELECT * FROM population_by_year_state

下面的示例使用一个外部表作为 CETAS 的源。 此示例依赖于先前创建的凭据、数据源、外部文件格式和外部表。 请参阅外部表文档。

-- use CETAS with select from external table
CREATE EXTERNAL TABLE population_by_year_state
WITH (
    LOCATION = 'aggregated_data/',
    DATA_SOURCE = population_ds,  
    FILE_FORMAT = census_file_format
)  
AS
SELECT decennialTime, stateName, SUM(population) AS population
FROM census_external_table
GROUP BY decennialTime, stateName
GO

-- you can query the newly created external table
SELECT * FROM population_by_year_state

常规示例

在此示例中,我们可以看到用于编写 CETAS 的模板代码示例,在其中使用“视图”作为源,使用“托管标识”作为身份验证。

CREATE DATABASE [<mydatabase>];
GO

USE [<mydatabase>];
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';

CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'Managed Identity';
GO

CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
    LOCATION = 'https://<mystoageaccount>.dfs.core.chinacloudapi.cn/<mycontainer>/<mybaseoutputfolderpath>',
    CREDENTIAL = [WorkspaceIdentity]
);
GO

CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
        LOCATION = '<myoutputsubfolder>/',
        DATA_SOURCE = [SynapseSQLwriteable],
        FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO

支持的数据类型

CETAS 可用于存储包含以下 SQL 数据类型的结果集:

  • binary
  • varbinary
  • char
  • varchar
  • nchar
  • nvarchar
  • smalldate
  • date
  • datetime
  • datetime2
  • datetimeoffset
  • time
  • Decimal
  • numeric
  • FLOAT
  • real
  • bigint
  • tinyint
  • smallint
  • int
  • bigint
  • bit
  • money
  • smallmoney
  • uniqueidentifier

注意

大于 1MB 的 LOB 无法与 CETAS 一起使用。

后续步骤

尝试查询 Apache Spark for Azure Synapse 外部表