2017-05-29 60 views
0

我想引用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.公式結果是錯誤的

回答

1

這是因爲參數提取到一本字典,那字典序列化爲一個字符串,這意味着順序不會被保留。看看https://github.com/googledatalab/pydatalab/blob/master/google/datalab/bigquery/_udf.py#L96

這是否對您造成任何問題? BigQuery docs沒有說要求有序的參數。

+0

是的,它確實引起了我的問題。請參考我剛剛添加到我原始問題中的示例。 – foxwendy

+0

我的意思是,當我使用%% bq udf --name interpolate -l js時,我不知道最終解析的UDF定義(通過datalab),參數順序與我的'@param'列表不同,所以在我的電話中,我應該在第三和第四位通過lagValue和leadValue。我認爲datalab應該保留用戶在'@param'列表中給出的順序。 – foxwendy

+0

你是對的。我在這裏打開了一個問題:https://github.com/googledatalab/pydatalab/issues/395。 – yelsayed