3

我已通过 poly-base 将 Azure blob 存储中的文件数据加载到 Azure SQL DW 外部表。现在 Blob 容器中的文件已更新。现在我想加载新数据。任何人都可以建议如何通过 poly base 将新数据加载到外部表中。?我正在尝试一种方法来删除外部表(如果存在)并再次创建它以加载新数据。

4

2 回答 2

7

无需删除外部表即可查看新数据。但是,如果需要,您可以使用DROP EXTERNAL TABLE语法删除 Polybase / 外部表,例如更改定义或REJECT_TYPE. 您还可以sys.external_tables在丢弃它们之前检查 DMV 是否存在,例如

IF EXISTS ( SELECT * FROM sys.external_tables WHERE object_id = OBJECT_ID('yourSchema.yourTable') )
    DROP EXTERNAL TABLE yourSchema.yourTable
GO

Azure SQL 数据仓库尚不支持DROP IF EXISTS (DIESQL Server 2016 中的 ) 语法。但如前所述,无需删除外部表即可查看新数据。如果 blob 文件已更新,则新数据将在您下次查询时简单地出现在外部表中。

另一种方法是在外部表定义中提供目录名称。然后只需将新文件拖放到文件夹中,下次查询表时就会出现数据,例如

CREATE EXTERNAL TABLE dbo.DimDate2External (
    DateId INT NOT NULL,
    CalendarQuarter TINYINT NOT NULL,
    FiscalQuarter TINYINT NOT NULL
)
WITH (
    LOCATION='/textfiles/dimDate/',
    DATA_SOURCE=AzureStorage,
    FILE_FORMAT=TextFile
);

因此,假设您在该文件夹中有一个名为的初始文件,DimDate1.txt然后添加了一个名为的新文件DimDate2.txt,它将在表中显示为一个。

于 2017-01-23T09:19:13.790 回答
2

如果您已按照https://msdn.microsoft.com/en-us/library/dn935021.aspx中的指定创建了一个外部表 ,那么应该没什么可做的。

外部表将是指向您文件的“指针”,每次查询该表时,都会从原始文件中读取数据。这样,如果您更新文件,则无需对 Azure SQL DW 执行任何操作。

如果您已使用 CREATE TABLE AS SELECT 语法(请参阅https://msdn.microsoft.com/en-us/library/mt204041.aspx )在 Azure SQL DW 中导入数据,从外部表读取,则需要删除表,但不是外部表,因为上面也适用于此,当您查询外部表时,将读取更新的文件。

所以:

--creating an external table (using defined external data source and file format):
CREATE EXTERNAL TABLE ClickStream (   
url varchar(50),  
event_date date,  
user_IP varchar(50)  
)  
WITH (  
    LOCATION='/webdata/employee.tbl',  
    DATA_SOURCE = mydatasource,  
    FILE_FORMAT = myfileformat  
)  
; 

当您从 ClickStream 中选择时,它将始终从 /webdata/employee.tbl 文件中读取内容。如果您仅使用新数据更新 employee.tbl 文件,则无需执行任何操作。

反而:

--Use CREATE TABLE AS SELECT to import the Azure blob storage data into a new   
--SQL Data Warehouse table called ClickStreamData  
CREATE TABLE ClickStreamData   
WITH  
(  
CLUSTERED COLUMNSTORE INDEX,  
DISTRIBUTION = HASH (user_IP)  
)  
AS SELECT * FROM ClickStream  
; 

数据将被复制到实例中的 ClickStreamData 表中,并且不会反映对文件的更新。在这种情况下,您需要删除 ClickStreamData 并重新创建它,但您仍然可以使用 ClickStream 作为源,因为该外部表将从更新的文件中读取数据。

于 2017-01-23T09:08:40.233 回答