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

Stream Analytics UDF - using the output from one UDF in another

以下代码导致我的 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 的输出?

你可以把它写成两条语句。第一个 selects Collect() 和 avg() 与分组依据。第二个 select 使用结果调用 UDF。

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

如果您将查询分成多个步骤,正如 Vignesh 所建议的那样,您最终将在第一步中计算 COLLECT 超过 60 秒 window:

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

我们将其命名为step1。现在,由于您仅按 window 分组,每 60 秒您将只有一个列 c 的值。 除非您增加 window 的大小以聚合多个值...

,否则无需对此进行任何聚合

所以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