Azure Data Lake 中的 U-SQL 游标
U-SQL cursor in Azure Data Lake
我需要处理 Azure Data Lake 中的数据。
我的流程如下:
- 我想select从数据库中获取ID列表以供下一次处理。这个我已经做到了。
- 我需要遍历 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/
我需要处理 Azure Data Lake 中的数据。 我的流程如下:
- 我想select从数据库中获取ID列表以供下一次处理。这个我已经做到了。
- 我需要遍历 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/