Как создать внешнюю таблицу Drop Poly Base, если она существует?

Я загрузил данные файла из хранилища BLOB-объектов Azure во внешнюю таблицу Azure SQL DW через поли-базу. Теперь файл, представленный в контейнере Blob, обновлен. Теперь я хочу загрузить свежие данные. Кто-нибудь может предложить, как свежие данные могут быть загружены во внешнюю таблицу через поли базы. Я пытаюсь способ удалить внешнюю таблицу, если она существует, и создать ее снова, чтобы загрузить свежие данные.

2 ответа

Для просмотра новых данных не нужно удалять внешние таблицы. Однако вы можете использовать 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

Хранилище данных SQL Azure еще не поддерживает 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 не предпринимается.

Если вы импортировали свои данные в Azure SQL DW с использованием синтаксиса CREATE TABLE AS SELECT (см. 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 в качестве источника, так как эта внешняя таблица будет считывать данные из обновленного файла.

Другие вопросы по тегам