如何存在Drop Poly Base外部表?

时间:2017-01-23 07:48:10

标签: azure-sqldw external-tables polybase

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

2 个答案:

答案 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作为源,因为该外部表将从更新的文件中读取数据。