Я загрузил данные файла из хранилища Azure blob в внешнюю таблицу Azure SQL DW через poly-base. Теперь файл, присутствующий в контейнере Blob, обновлен. Теперь я хочу загрузить свежие данные. Может ли кто-нибудь предложить, как свежие данные могут быть загружены на внешнюю таблицу через поли базовую.? Я пытаюсь удалить внешнюю таблицу, если она существует, и снова создать ее для загрузки свежих данных.Как создать таблицу внешнего дерева Base Base, если существует?
ответ
Если вы создали внешнюю таблицу, указанную в 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 в качестве источника, так как эта внешняя таблица будет считывать данные из обновленного файла.
Нет необходимости отбрасывать внешние таблицы для просмотра новых данных. Однако вы можете использовать синтаксис DROP EXTERNAL TABLE
для отбрасывания таблиц Polybase/external, если это необходимо, например, для изменения определения или 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 Data Warehouse пока не поддерживает) синтаксис 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
он будет отображаться в таблице как один.
Если файл в блочном хранилище обновлен, вы можете просто запросить внешнюю таблицу, и она покажет новые данные - не нужно ее всплывать и воссоздавать. – wBob