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