从Blob存储创建Azure SQL数据库中的表

时间:2017-01-20 15:51:30

标签: database azure azure-sql-database azure-storage-blobs

我需要从Azure数据仓库中取出大表,然后将它们移到独立的Azure SQL数据库中。我还没有能够让数据工厂足够快地运行我的方案。我可以通过外部表从我的数据仓库中获取我的表到Blob存储。我无法弄清楚的是如何使用外部数据源在Azure SQL数据库上创建外部表到我的Blob存储。

这是用于将我的表放入blob存储的格式文件,外部数据源和外部表:

CREATE EXTERNAL FILE FORMAT [DelimitedText] 
WITH (
    FORMAT_TYPE = DELIMITEDTEXT, 
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = N'~¶~', 
        USE_TYPE_DEFAULT = False
    ), 
    DATA_COMPRESSION = N'org.apache.hadoop.io.compress.GzipCodec')
GO

CREATE EXTERNAL DATA SOURCE [myDataSource] 
WITH (
    TYPE = HADOOP, 
    LOCATION = N'wasbs://<blob container>@<storage account>.blob.core.windows.net', 
    CREDENTIAL = [myCredential])
GO

CREATE EXTERNAL TABLE [dbo].[myTable] 
WITH (
    DATA_SOURCE = [myDataSource] ,
    LOCATION = N'MY_FOLDER/',
    FILE_FORMAT = [DelimitedText]
)
AS
SELECT *
FROM dbo.mytable

我能够在Azure SQL数据库中创建的唯一外部数据源TYPE=SHARD_MAP_MANAGER是正确的还是必要的?此链接看起来我应该能够使用TYPE=HADOOP创建外部数据源,但我在EXTERNAL&#34;附近出现了错误#34;错误。我也无法创建外部文件格式。这可能在Azure SQL数据库中吗?

https://msdn.microsoft.com/en-us/library/dn935022.aspx#Examples: Azure SQL Database

最终,我尝试为我的blob存储创建一个外部表,然后从该blob插入我的Azure SQL数据库中的表。然后放下容器。

2 个答案:

答案 0 :(得分:4)

无法在 Azure SQL数据库上使用PolyBase功能,仅在内部部署 SQL Server 2016数据库中使用。

the article中有一个注释:

  

仅在SQL Server 2016,Azure SQL数据仓库和并行数据仓库上支持PolyBase。仅在Azure SQL数据库v12或更高版本上支持弹性数据库查询。

相反,您可以创建Azure SQL Data Warehouse(如果您愿意,可以在同一个Azure SQL Server上)。如果您继续使用该指南,该指南将适合您。它不适用于Hadoop(https://msdn.microsoft.com/en-us/library/mt703314.aspx),但正如我所理解的那样,您从Azure blob存储导入问题,这将适用于Azure SQL数据仓库。

答案 1 :(得分:2)

Azure SQL数据库最近获得了使用BULK INSERT或OPENROWSET从Azure Blob存储加载文件的功能。开始here

从链接文章中获取的两个简单代码示例:

DO
$$
DECLARE
  qs TEXT;
BEGIN
  FOR qs IN array_cat( -- as @ammoQ suggested to do UNION ALL
    SELECT array_agg(messages) FROM posts UNION ALL
    SELECT array_agg(comments) FROM boards )
  LOOP
    -- here I need: count chars really processed
    -- to do not exceed the billing quota of external api
    -- then make an UPSERT into cache table for another long process
    -- if quota is not exceeded
  END LOOP;
-- and return total of processed symbols
END;
$$ LANGUAGE plpgsql;