从SQL表中读取U-SQL Paralell

时间:2017-08-21 10:04:31

标签: azure-data-lake u-sql

我有一个场景,我使用U-SQL将数据从MS SQL DB提取到Azure Data Lake中。我的桌子很大,有超过1600万条记录(很快就会有更多)。我只是做SELECT a, b, c FROM dbo.myTable;

然而,我意识到只有一个顶点用于从表中读取。

enter image description here

我的问题是,有没有办法在从SQL表中读取时利用并行性?

3 个答案:

答案 0 :(得分:4)

我不认为U-SQL支持外部数据源的并行性(尽管很乐意纠正)。如果您认为这是一个重要的缺失功能,您可以在此处创建请求并投票:

https://feedback.azure.com/forums/327234-data-lake

作为一种变通方法,您可以手动并行查询,具体取决于数据源中可用的列。例如按日期

// External query working
USE DATABASE yourADLADB;

// Create the external query for year 2016
@results2016 =
    SELECT *
    FROM EXTERNAL yourSQLDBDataSource EXECUTE 
        @"SELECT * FROM dbo.yourBigTable WITH (NOLOCK) WHERE yourDateCol Between '1 Jan 2016 and 31 Dec 2016'";


// Create the external query for year 2017
@results2017 =
    SELECT *
    FROM EXTERNAL yourSQLDBDataSource EXECUTE 
        @"SELECT * FROM dbo.yourBigTable WITH (NOLOCK) WHERE yourDateCol Between '1 Jan 2017 and 31 Dec 2017";


// Output 2016 results
OUTPUT @results2016
TO "/output/bigTable/results2016.csv"
USING Outputters.Csv();


// Output 2017 results
OUTPUT @results2017
TO "/output/bigTable/results2017.csv"
USING Outputters.Csv();

现在,我通过将文件分成多个部分来创建一个不同的问题。但是,您可以使用也将并行化的文件集来读取这些文件集,例如:

@input =
    EXTRACT 
            ... // your column list
    FROM "/output/bigTable/results{year}.csv"
    USING Extractors.Csv();

我会问为什么你选择将这么大的文件移到你的湖中,因为ADLA和U-SQL使你能够查询它所在的数据。你能进一步解释一下吗?

答案 1 :(得分:1)

对外部数据源的查询不会在U-SQL中自动并行化。 (这是我们正在考虑的未来)

wBob的回答确实提供了一个实现相同效果的选项 - 尽管它当然要求您使用多个U-SQL语句手动分区和查询数据。

请注意,如果在源处发生并行写入,则在非事务处理环境中执行并行读取可能会导致重复或丢失数据。因此需要注意一些,用户需要知道权衡。

答案 2 :(得分:0)

此处的另一个潜在解决方案是创建一个由与ADLA帐户相同的ADLS商店支持的HDInsight群集。

然后,您可以使用Apache Sqoop将数据从SQL服务器并行复制到ADLS中的目录,然后使用U-SQL将该数据(将跨多个文件拆分)导入到表中。