【问题标题】:How to a Drop Poly Base external table if exists?如果存在,如何删除 Polybase 外部表?
【发布时间】:2017-06-07 16:06:49
【问题描述】:

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

【问题讨论】:

  • 如果 blob 存储中的文件已更新,您可以简单地查询外部表,它将显示新数据 - 无需删除并重新创建。

标签: azure-sqldw external-tables polybase


【解决方案1】:

无需删除外部表即可查看新数据。但是,如果需要,您可以使用 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 的新文件,它将在表中显示为一个。

【讨论】:

    【解决方案2】:

    如果您已按照中指定的方式创建了外部表 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 作为源,因为该外部表将从更新的文件中读取数据。

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多