流分析 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
以下代码导致我的 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