流分析UDF-在另一个UDF中使用输出

时间:2018-07-04 05:21:14

标签: azure-stream-analytics

以下代码导致我的GT2HP值在UDF的以下内容中为空:

SELECT 
    UDF.GT2HP(Collect()) as GT2HP,
    UDF.LPLPReturns(Collect()) as LPLPReturns,
    UDF.LPGasHeater(Collect()) as LPGasHeater,
    UDF.HPRaisedSW(Collect(), AVG(GT2HP)) as HPRaisedSW,
    UDF.HPCustomerDemand(Collect(), AVG(GT2HP)) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM IotHubInput
WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
GROUP BY TumblingWindow(second, 60)

以下代码有效:

SELECT 
    UDF.GT2HP(Collect()) as GT2HP,
    UDF.LPLPReturns(Collect()) as LPLPReturns,
    UDF.LPGasHeater(Collect()) as LPGasHeater,
    UDF.HPRaisedSW(Collect(), UDF.GT2HP(Collect())) as HPRaisedSW,
    UDF.HPCustomerDemand(Collect(), UDF.GT2HP(Collect())) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM IotHubInput
WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
GROUP BY TumblingWindow(second, 60)

很明显,第二个代码比第一个代码在计算上要昂贵得多,如果可能的话,我想避免使用它。

我想在UDF中使用第一个UDF的输出,但是它似乎传递了null。所有的select语句似乎都是并行执行而不是串行执行,这可能解释了null。

是否可以在另一个UDF中使用一个UDF的输出?

2 个答案:

答案 0 :(得分:0)

您可以将其编写为两个语句。第一个选择分组为by的Collect()和avg()。第二选择使用结果调用UDF。

答案 1 :(得分:0)

GT2HP中引用的AVG(GT2HP)列始终为空的原因是由于SQL语义。 SELECT子句中的列只能引用FROM中引用的源,并且由于没有IotHubInput.GT2HP-它被解释为null。

如果您将查询分为多个步骤,如Vignesh所建议的那样,您将首先完成第一步,即在60秒的时间内计算COLLECT

SELECT Collect() AS c
WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
FROM IotHubInput
GROUP BY TumblingWindow(second, 60)

我们将其命名为step1。现在,由于仅按窗口分组,因此每60秒只有c列一个值。 除非您增加窗口的大小以聚合多个值,否则无需进行任何聚合...

因此不需要AVG(GT2HP)中的AVG。 第二步将是:

SELECT
    c,
    GT2HP = UDF.GT2HP(c)
FROM step1

让我们将此步骤称为step2。 现在最终的选择将是:

SELECT 
    GT2HP,
    UDF.LPLPReturns(c) as LPLPReturns,
    UDF.LPGasHeater(c) as LPGasHeater,
    UDF.HPRaisedSW(c, GT2HP) as HPRaisedSW,
    UDF.HPCustomerDemand(c, GT2HP) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM step2

将它们放在一起:

WITH step1 AS (
    SELECT Collect() AS c
    WHERE IoTHub.ConnectionDeviceId = 'uk-iotedge'
    FROM IotHubInput
    GROUP BY TumblingWindow(second, 60)
),
step2 AS (
    SELECT
        c,
        GT2HP = UDF.GT2HP(c)
    FROM step1
)

SELECT 
    GT2HP,
    UDF.LPLPReturns(c) as LPLPReturns,
    UDF.LPGasHeater(c) as LPGasHeater,
    UDF.HPRaisedSW(c, GT2HP) as HPRaisedSW,
    UDF.HPCustomerDemand(c, GT2HP) as HPCustomerDemand
INTO SQLDWUKSTEAMLOSS
FROM step2