我想引用datalab中现有的UDF。我有这样的:Google Datalab - 奇怪的UDF扩展
%%bq udf --name interpolate -l js
// A function do liner interpolate
// @param lagValue FLOAT64
// @param leadValue FLOAT64
// @param lagReference FLOAT64
// @param leadReference FLOAT64
// @param currentReference FLOAT64
// @returns FLOAT64
// @import gs://myfilehere.js
return interpolate(lagValue, leadValue, lagReference, leadReference, currentReference);
预期扩大SQL应该是:
CREATE TEMPORARY FUNCTION interpolate (lagValue FLOAT64,leadValue FLOAT64, lagReference FLOAT64,leadReference FLOAT64,currentReference FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
// A function do liner interpolate
// @param lagValue FLOAT64
// @param leadValue FLOAT64
// @param lagReference FLOAT64
// @param leadReference FLOAT64
// @param currentReference FLOAT64
// @returns FLOAT64
// @import gs://myfilehere.js
return interpolate(lagValue, leadValue, lagReference, leadReference, currentReference);
"""
OPTIONS (
library="gs://myfilehere.js"
);
不过,我
CREATE TEMPORARY FUNCTION interpolate (lagReference FLOAT64,leadReference FLOAT64,lagValue FLOAT64,leadValue FLOAT64,currentReference FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
// A function do liner interpolate
// @param lagValue FLOAT64
// @param leadValue FLOAT64
// @param lagReference FLOAT64
// @param leadReference FLOAT64
// @param currentReference FLOAT64
// @returns FLOAT64
// @import gs://myfilehere.js
return interpolate(lagValue, leadValue, lagReference, leadReference, currentReference);
"""
OPTIONS (
library="gs://myfilehere.js"
);
所以,最终的UDF参数顺序弄乱。但是,我通读源代码,找不到实际导致问题的任何内容。在这里需要帮助。 (我与datalab版本1.2.20170525)这里
例
我的JavaScript的定义插值功能:
function interpolate(lagValue, leadValue, lagReference, leadReference, currentReference)
{
if(lagReference==null)
{
return leadValue;
}
if(leadReference==null)
{
return lagValue;
}
if(Math.abs(leadReference-lagReference) > 0)
{
return lagValue + (((currentReference-lagReference)*(leadValue-lagValue))/(leadReference-lagReference));
}
else
{
return null;
}
};
说我在我的查询会打电话给插补功能:
%%bq query --udfs interpolate
select interpolate(30,20,1,3,2)
这里正确的运行应该是:lagValue=30, leadValue=20, lagReference=1,leadReference=3, currentReference=2.
然而,当参数顺序弄乱“创建临时函数”的一部分,这是实际发生的事情: lagValue=1,leadValue=3,lagReference=30,leadReference=20, currentReference=2.
公式结果是错误的
是的,它确实引起了我的问题。请参考我刚刚添加到我原始问题中的示例。 – foxwendy
我的意思是,当我使用%% bq udf --name interpolate -l js时,我不知道最终解析的UDF定义(通过datalab),参数顺序与我的'@param'列表不同,所以在我的电话中,我应该在第三和第四位通过lagValue和leadValue。我认为datalab应该保留用户在'@param'列表中给出的顺序。 – foxwendy
你是对的。我在这里打开了一个问题:https://github.com/googledatalab/pydatalab/issues/395。 – yelsayed