我已经通过poly-base将Azure blob存储中的文件数据加载到Azure SQL DW外部表。现在,Blob容器中的文件已更新。现在我想加载新数据。任何人都可以建议如何通过poly base将新数据加载到外部表中。我正在尝试删除外部表(如果存在)并再次创建它以加载新数据。
答案 0 :(得分:5)
无需删除外部表来查看新数据。但是,如果需要,您可以使用DROP EXTERNAL TABLE
语法删除Polybase /外部表,例如更改定义或REJECT_TYPE
。您也可以在删除之前检查DMV sys.external_tables
是否存在,例如
IF EXISTS ( SELECT * FROM sys.external_tables WHERE object_id = OBJECT_ID('yourSchema.yourTable') )
DROP EXTERNAL TABLE yourSchema.yourTable
GO
Azure SQL数据仓库尚不支持SQL Server 2016中的DROP IF EXISTS (DIE
)语法。但是如上所述,不需要删除外部表只是为了查看新数据。如果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
的新文件,它将在表格中显示为一个。
答案 1 :(得分:2)
如果您已按照中的指定创建了外部表 https://msdn.microsoft.com/en-us/library/dn935021.aspx,那就不应该做任何事了。
外部表将是文件的“指针”,每次查询表时,都会从原始文件中读取数据。这样,如果更新文件,则无法对Azure SQL DW执行任何操作。
如果您使用CREATE TABLE AS SELECT语法在Azure SQL DW中导入数据(请参阅https://msdn.microsoft.com/en-us/library/mt204041.aspx),从外部表中读取,则需要删除表,而不是外部表,因为上面也适用于此,当您查询外部表时,将读取更新的文件。
所以:
--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作为源,因为该外部表将从更新的文件中读取数据。