我已通过 poly-base 将 Azure blob 存储中的文件数据加载到 Azure SQL DW 外部表。现在 Blob 容器中的文件已更新。现在我想加载新数据。任何人都可以建议如何通过 poly base 将新数据加载到外部表中。?我正在尝试一种方法来删除外部表(如果存在)并再次创建它以加载新数据。
2 回答
无需删除外部表即可查看新数据。但是,如果需要,您可以使用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 (DIE
SQL 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
,它将在表中显示为一个。
如果您已按照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 作为源,因为该外部表将从更新的文件中读取数据。