我想引用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