2017-05-29 64 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