Azure Data Lake 中的 U-SQL 游标

U-SQL cursor in Azure Data Lake

我需要处理 Azure Data Lake 中的数据。 我的流程如下:

  1. 我想select从数据库中获取ID列表以供下一次处理。这个我已经做到了。
  2. 我需要遍历 ID(从第一步开始),我需要连续将数据导出到单独的文件(按 ID 分区)

问题如下statemanet:

U-SQL’s procedures do not provide any imperative code-flow constructs such as a for or while loops.

知道如何以与游标类似的方式处理数据吗?

我没有在 U-SQL.

中找到任何关于游标的文档

谢谢!

U-SQL 中没有游标,因为您在上面引用了语句。

U-SQL 不提供任何命令式代码流结构,因为它阻碍了优化器全局优化脚本的能力。

您应该考虑以声明的方式解决您的问题。例如,如果您有一个 ID 列表(在 table 或 SqlArray 或什至文件中),请使用声明式连接。例如,您想要将 42 添加到键在现有键列表中的每个值:

// Two options for providing the "looping data"
// Option 1: Array Variable
DECLARE @keys_var = new SqlArray<string>{"k1", "k2", "k3"};

// Option 2: Rowset (eg from an EXTRACT from file, a table or other place)
@keys = SELECT * FROM (VALUES("k1"), ("k2"), ("k3")) AS T(key);

// This is the data you want to iterate over to add 42 to the value column for every matching key
@inputdata = SELECT * FROM (VALUES (1, "k1"), (2, "k1"), (3, "k2"), (6, "k5")) AS T(value, key);

//Option 1:
@res = SELECT value+42 AS newval, key FROM @inputdata WHERE @keys_var.Contains(key);

OUTPUT @res TO "/output/opt1.csv" USING Outputters.Csv();

//Option 2:
@res = SELECT value+42 AS newval, i.key 
    FROM @inputdata AS i INNER JOIN @keys AS k 
         ON i.key == k.key;

OUTPUT @res TO "/output/opt2.csv" USING Outputters.Csv();

在您的情况下,您希望拥有数据驱动的输出文件集。此功能目前正在开发中(它是我们的 top asks 之一)。在那之前你必须编写一个脚本来生成脚本(我将提供一个关于你的其他问题的例子)。

如果您真的想要迭代行为,您需要从 PowerShell 调用 USQL。

例如:

ForEach ($Date in $Dates)
    {
    $USQLProcCall = '[dbo].[usp_OutputDailyAvgSpeed]("' + $Date + '");'
    $JobName = 'Output daily avg dataset for ' + $Date

    Write-Host $USQLProcCall

    $job = Submit-AzureRmDataLakeAnalyticsJob `
        -Name $JobName `
        -AccountName $DLAnalyticsName `
        –Script $USQLProcCall `
        -DegreeOfParallelism $DLAnalyticsDoP

    Write-Host "Job submitted for " $Date
    }

来源:https://www.purplefrogsystems.com/paul/2017/05/recursive-u-sql-with-powershell-u-sql-looping/