2016-12-30 48 views
1

我想将行集变量用作缩放变量。U-Sql使用行集变量进行决策

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

这可能吗?

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

我想阻止基于某些条件的复杂u-sql代码,可以说基于一些控制表。在我的原始代码中,我写了10-15个u-sql语句,并且我想在If语句中绑定它们。我不想交叉加入,因为它再次开始尝试加入表格。如果我使用交叉连接,则执行时间不会有很大的节省。使用IF语句是,如果条件不符合,则不应执行完整的代码段。可能吗?

+0

暂时忘掉U-SQL。用简单的语言用英语定义你的问题并写出来。然后,了解您对U-SQL的了解,然后再次尝试解决您的问题。尝试并忽略您已写入的代码。很可能Powershell和U-SQL的组合可以解决您的问题。 – wBob

+0

关于'CROSS JOIN'和性能 - 你有没有试过这个,性能很差?如果是这样,考虑编写一个错误报告,因为我期望'CROSS JOIN'快速短路。 – wBob

回答

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

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

+0

这将是很好的添加一个解释,否则代码的答案。 – trincot

+0

请参阅编辑... – Ajay

+1

(遵循您的编辑)U-SQL中没有这样的控制语句。你需要用关系代数来表达你的问题。这是允许引擎预编译执行计划并且并行执行的关键。 –

1

为了增加wBob的和亚历克斯的答案:

U型SQL不提供驱动的脚本中的控制流数据。当前的IF语句要求在编译时对表达式进行评估。

考虑一个U-SQL脚本只是一个声明性查询。因此,您有以下选择:

  1. 用关系表达式表达您的问题。这意味着你将不得不编写一个(交叉)连接来保护执行。如果您觉得查询优化器在优化此类警卫方面做得不好(例如,它会在廉价警卫之前评估该联合的昂贵方面),请报告问题,我们将会看一看。

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

话虽如此,理论上是可能的程度上语言代数与“如果条件不满足不执行这个操作符树的剩余部分”操作符。但是,这是一个重要的工作项目,可能会导致在编译过程中可能超出当前限制的非常大的查询计划。如果您觉得上述1和2都不足以帮助您解决问题,请将您的投票加入https://feedback.azure.com/forums/327234-data-lake/suggestions/17635906-please-add-dynamic-if-evaluation-to-u-sql