Я хотел сослаться на существующий UDF из datalab. У меня есть это:
%%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 перепутался. Однако я прочитал исходный код и не смог найти ничего, что действительно вызывает проблему. Нужна помощь здесь. (у меня даталаб версии 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.
результат уравнения неверен.