U-Sql使用rowset变量进行决策

时间:2016-12-30 10:27:07

标签: u-sql

我想使用rowset变量作为缩放变量。

@cnt = Select count(*) from @tab1; If (@cnt > 0) then @cnt1= select * from @tab2; End;

有可能吗?

======================================

我想根据某些条件阻止复杂的u-sql代码,假设基于某些控制表。在我的原始代码中,我编写了10-15个u-sql语句,我想在If语句中绑定它们。我不想做交叉连接,因为它再次开始尝试加入表。如果我使用交叉连接,则执行时间没有明显的节省。使用IF语句是,如果条件不满足,则不应执行完整的代码段。有可能吗?

2 个答案:

答案 0 :(得分:2)

添加到wBob和Alex的答案:

U-SQL不在脚本中提供数据驱动的控制流。当前IF语句要求在编译时计算表达式。

将U-SQL脚本视为单个声明性查询。所以你有以下选择:

  1. 用关系表达式表达您的问题。这意味着您必须编写(交叉)连接以保护执行。如果您认为查询优化器在优化此类防护方面做得不好(例如,它在廉价防护之前评估加入的昂贵方面),请报告问题,我们将看一看。

  2. 将您的脚本拆分为多个脚本,并在执行下一步之前查看每个脚本的结果。这是一种业务流程形式,您可以使用ADF或使用Powershell或任何SDK编写自己的业务流程。需要注意的是,您必须将中间结果写入文件并将文件下载到您的业务流程层。

  3. 话说回来,理论上可以将语言代数扩展为“如果条件不满足则不执行该运算符树的剩余部分”运算符。但是,这是一个主要的工作项,并且可能导致编译期间非常大的查询计划可能超出当前限制。如果您认为上述1和2都不足以帮助您完成您的方案,请将您的投票添加到https://feedback.azure.com/forums/327234-data-lake/suggestions/17635906-please-add-dynamic-if-evaluation-to-u-sql

答案 1 :(得分:1)

@cnt1 =
    SELECT @tab2.*
    FROM @tab2
    CROSS JOIN (SELECT COUNT(*) AS cnt FROM @tab1) AS c
    WHERE c.cnt > 0;

(添加说明) CROSS JOIN返回@ tab2中所有行的笛卡尔积和COUNT查询生成的单行。有WHERE条件然后确保查询的结果是来自@ tab2的所有行,如果COUNT(*)> 0,否则没有行。