数据虚拟化(预览版)

适用于:✅Microsoft Fabric 中的 SQL 数据库

重要

此功能目前为预览版

通过 Fabric 中的 SQL 数据库中的数据虚拟化,可以使用 T-SQL 查询 OneLake 中存储的外部数据。

使用数据虚拟化语法,可以对以 OneLake 中的常见数据格式存储数据的文件执行 Transact-SQL(T-SQL)查询。 可以使用联接将此数据与本地存储的关系数据合并。 借助数据虚拟化,可以在只读模式下以透明方式访问外部数据,同时使其保持原始格式和位置。

Syntax

Fabric SQL 数据库支持以下数据虚拟化功能:

Authentication

Fabric Lakehouses 的认证使用 Microsoft Entra ID 直通身份验证。

从 Fabric OneLake 访问文件需要用户身份对 Lakehouse 和文件位置拥有权限。

Permissions

用户必须具有对 OneLake 中的文件或文件夹的读取权限,这通过 Microsoft Entra ID 传递来强制实施。

支持的文件类型

  • Parquet
  • CSV
  • 通过指定 CSV 文件格式间接支持 JSON 文件格式,其中查询将每个文档作为单独的行返回。 可以使用 JSON_VALUEOPENJSON 进一步分析行。

支持的数据源

目前仅原生支持 Fabric Lakehouse。 但是,OneLake 快捷方式可用于扩展到各种外部源,例如 Azure Blob 存储、Azure Data Lake Gen2、Dataverse、Amazon S3、Amazon S3 兼容、Google 云存储、公共 HTTPS 等。

有关 Fabric 快捷方式的详细信息,请参阅 使用 OneLake 快捷方式统一数据源

如何查找 Lakehouse 的 ABFSS 文件位置

要创建 Fabric Lakehouse 数据源,你需要提供工作区 ID、租户和湖屋 ID。 若要查找 Lakehouse 的 ABFSS 文件位置,请执行以下操作:

  1. 转到 Fabric 门户。
  2. 导航到 Lakehouse。
  3. 导航到所需的文件夹位置。
  4. 选择 ... ,然后选择 “属性”。
  5. 复制 ABFS路径,大致如下: abfss://<workspace ID>@<Tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/

局限性

  • 必须使用架构限定的名称查询 CSV 外部表,例如 dbo.Customer_CSV
  • BULK INSERT 当前仅当与 OPENROWSET (BULK) 结合使用时才受支持。

例子

以下示例脚本使用一个名为 Cold_Lake 的 Fabric Lakehouse,托管在 parquet 和 csv 文件中的 Contoso 的商店和客户数据。

名为 Cold _ Lake 的示例 Lakehouse 的屏幕截图。

答: 使用 OPENROWSET 查询 parquet 文件

以下示例演示如何使用 OPENROWSET 从 Parquet 文件中获取示例数据。

SELECT TOP 100 *  
FROM OPENROWSET(  
    BULK 'abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/Contoso/customer.parquet',  
    FORMAT = 'parquet'  
) AS customer_dataset;  

B. 使用 OPENROWSET 查询 CSV 文件

下面的示例演示如何从 OPENROWSET CSV 文件检索示例数据。

SELECT *  
FROM OPENROWSET(  
    BULK 'abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/Contoso/customer.csv',  
    FORMAT = 'CSV',  
    FIRST_ROW = 2  
) WITH (  
    CustomerKey INT,  
    GeoAreaKey INT,  
    StartDT DATETIME2,  
    EndDT DATETIME2,  
    Continent NVARCHAR(50),  
    Gender NVARCHAR(10),  
    Title NVARCHAR(10),  
    GivenName NVARCHAR(100),  
    MiddleInitial VARCHAR(2),  
    Surname NVARCHAR(100),  
    StreetAddress NVARCHAR(200),  
    City NVARCHAR(100),  
    State NVARCHAR(100),  
    StateFull NVARCHAR(100),  
    ZipCode NVARCHAR(20),  
    Country_Region NCHAR(2),  
    Country_Region_Full NVARCHAR(100),  
    Birthday DATETIME2,  
    Age INT,  
    Occupation NVARCHAR(100),  
    Company NVARCHAR(100),  
    Vehicle NVARCHAR(100),  
    Latitude DECIMAL(10,6),  
    Longitude DECIMAL(10,6)  
) AS customer_dataset; 

C. 创建外部数据源

以下示例演示如何创建外部数据源以简化外部表和命令,例如 OPENROWSET

CREATE EXTERNAL DATA SOURCE [Cold_Lake] 
WITH ( 
LOCATION = 'abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/'); 

创建外部数据源后,可以简化 OPENROWSET,例如:

-- USING DATA SOURCE WITH OPENROWSET 
SELECT TOP 100 * FROM OPENROWSET 
(BULK '/customer.parquet' 
, FORMAT = 'parquet' 
, DATA_SOURCE = 'Cold_Lake' ) 
 AS Customer_dataset; 
-- USING DATA SOURCE WITH OPENROWSET 
SELECT TOP 100 *  
FROM OPENROWSET(  
    BULK '/customer.csv',  
    FORMAT = 'CSV',  
    DATA_SOURCE = 'Cold_Lake', 
    FIRST_ROW = 2  
) WITH (  
    CustomerKey INT,  
    GeoAreaKey INT,  
    StartDT DATETIME2,  
    EndDT DATETIME2,  
    Continent NVARCHAR(50),  
    Gender NVARCHAR(10),  
    Title NVARCHAR(10),  
    GivenName NVARCHAR(100),  
    MiddleInitial VARCHAR(2),  
    Surname NVARCHAR(100),  
    StreetAddress NVARCHAR(200),  
    City NVARCHAR(100),  
    State NVARCHAR(100),  
    StateFull NVARCHAR(100),  
    ZipCode NVARCHAR(20),  
    Country_Region NCHAR(2),  
    Country_Region_Full NVARCHAR(100),  
    Birthday DATETIME2,  
    Age INT,  
    Occupation NVARCHAR(100),  
    Company NVARCHAR(100),  
    Vehicle NVARCHAR(100),  
    Latitude DECIMAL(10,6),  
    Longitude DECIMAL(10,6)  
) AS customer_dataset; 

D. 为 parquet 创建外部表

下面的示例演示如何设置外部文件格式,然后专门为 parquet 数据创建外部表。

CREATE EXTERNAL FILE FORMAT Parquetff WITH (FORMAT_TYPE=PARQUET); 

CREATE EXTERNAL TABLE [ext_product]( 
    [ProductKey] [int] NULL, 
    [ProductCode] [nvarchar](255) NULL, 
    [ProductName] [nvarchar](500) NULL, 
    [Manufacturer] [nvarchar](50) NULL, 
    [Brand] [nvarchar](50) NULL, 
    [Color] [nvarchar](20) NULL, 
    [WeightUnit] [nvarchar](20) NULL, 
    [Weight] DECIMAL(20, 5) NULL, 
    [Cost] DECIMAL(20, 5) NULL, 
    [Price] DECIMAL(20, 5) NULL, 
    [CategoryKey] [int] NULL, 
    [CategoryName] [nvarchar](30) NULL, 
    [SubCategoryKey] [int] NULL, 
    [SubCategoryName] [nvarchar](50) NULL) 
WITH 
(LOCATION = '/product.parquet' 
,DATA_SOURCE = [Cold_Lake] 
,FILE_FORMAT = Parquetff); 
 
SELECT * FROM [dbo].[ext_product] 

E. 为 CSV 创建外部表

下面的示例演示如何设置外部文件格式并专门为 CSV 数据创建外部表。

CREATE EXTERNAL FILE FORMAT [CSVFileFormat]  
WITH (  
    FORMAT_TYPE = DELIMITEDTEXT,  
    FORMAT_OPTIONS (  
        FIELD_TERMINATOR = ',',  
        FIRST_ROW = 2  
    )  
); 
 
CREATE EXTERNAL TABLE ext_customer_csv ( 
    CustomerKey INT NOT NULL,  
    GeoAreaKey INT NOT NULL,  
    StartDT DATETIME2 NOT NULL, 
    EndDT DATETIME2 NOT NULL, 
    Continent VARCHAR(50) NOT NULL, 
    Gender VARCHAR(10) NOT NULL, 
    Title VARCHAR(10) NOT NULL,  
    GivenName VARCHAR(100) NOT NULL,  
    MiddleInitial VARCHAR(2) NOT NULL,  
    Surname VARCHAR(100) NOT NULL, 
    StreetAddress VARCHAR(200) NOT NULL, 
    City VARCHAR(100) NOT NULL, 
    State VARCHAR(100) NOT NULL, 
    StateFull VARCHAR(100) NOT NULL, 
    ZipCode VARCHAR(20) NOT NULL,  
    Country_Region CHAR(2) NOT NULL 
    ) 
WITH (  
LOCATION = '/customer.csv' 
, DATA_SOURCE = Cold_Lake 
, FILE_FORMAT = CSVFileFormat 
); 

SELECT * FROM [dbo].[ext_customer_csv]; 

F. 使用 OPENROWSET 引入数据

以下示例演示如何 OPENROWSET 用于将数据引入新表:

SELECT * 
INTO tb_store 
FROM OPENROWSET 
(BULK 'abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/Contoso/store.parquet' 
, FORMAT = 'parquet' )
 AS STORE;

对于现有表,可以用 INSERT INTOOPENROWSET 填充表。

INSERT INTO tb_store  
SELECT TOP 100 * FROM OPENROWSET 
(BULK ' abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/contoso/store.parquet' 
, FORMAT = 'parquet' ) 
 AS STORE; 

G. 使用元数据函数 - sp_describe_first_result_set

该函数 sp_describe_first_result_set 可以与 OPENROWSET (BULK) 结合使用来估计外部文件架构。 可以标识CREATE TABLE语句或CREATE EXTERNAL TABLE语句的架构,并进一步进行数据浏览。

sp_describe_first_result_set 函数使用数据示例来估计架构。 如果样本不具有代表性,它可以提供不准确的结果。 如果架构已已知,请通过 WITH 子句指定它。

EXEC sp_describe_first_result_set N'  
   SELECT * FROM OPENROWSET(  
      BULK ''abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/Contoso/store.parquet'',  
      FORMAT = ''parquet''  
   ) AS DATA'; 

有关详细信息,请参阅sp_describe_first_result_set()。

H. 使用元数据函数 - filename() 和 filepath()

Fabric SQL 数据库不仅提供用于文件夹和文件浏览的函数filename()filepath(),还支持动态查询创建。这些函数可以与 OPENROWSET 结合使用,将虚拟列应用于跨多个子文件夹的数据文件。

以下示例列出所有 parquet 文件及其位置。

SELECT 
  r.filename() as file_name
, r.filepath() as full_path 
FROM OPENROWSET
   (BULK 'abfss://<workspace ID>@<tenant>.dfs.fabric.microsoft.com/<lakehouse ID>/Files/*/*.parquet',  
    FORMAT = 'parquet'  
   ) AS r 
GROUP BY r.filename(), r.filepath() 
ORDER BY file_name;  

有关详细信息,请参阅 filename()filepath()。