Google Datalab - 奇怪的UDF扩展

时间:2017-05-29 20:06:59

标签: google-cloud-datalab

我想从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.

然而,当参数顺序在“CREATE TEMPORARY FUNCTION”部分搞砸时,这就是实际发生的事情: lagValue=1,leadValue=3,lagReference=30,leadReference=20, currentReference=2.方程式结果错误

1 个答案:

答案 0 :(得分:1)

这是因为参数被提取到字典中,然后该字典被序列化为字符串,这意味着不保留顺序。请看https://github.com/googledatalab/pydatalab/blob/master/google/datalab/bigquery/_udf.py#L96

这会给您带来任何问题吗? BigQuery docs没有说明要求有序参数。