Google Datalab — странное расширение UDF

Я хотел сослаться на существующий 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. результат уравнения неверен.


person foxwendy    schedule 29.05.2017    source источник


Ответы (1)


Это связано с тем, что параметры извлекаются в словарь, а затем этот словарь сериализуется в строку, что означает, что порядок не сохраняется. Посмотрите на https://github.com/googledatalab/pydatalab/blob/master/google/datalab/bigquery/_udf.py#L96.

Это вызывает какие-либо проблемы для вас? В документах BigQuery ничего не сказано. о требовании упорядоченных параметров.

person yelsayed    schedule 30.05.2017
comment
Да, это вызвало у меня проблемы. пожалуйста, обратитесь к примеру, который я только что добавил к своему исходному вопросу. - person foxwendy; 30.05.2017
comment
Я имею в виду, что когда я использовал %%bq udf --name interpolate -l js , я бы не знал, что в окончательном проанализированном определении UDF (от datalab) порядок параметров не совпадает с моим списком '@param', так что в моих вызовах я должен был передать lagValue и leadValue на 3-й и 4-й позиции. Я думаю, что datalab должен сохранить порядок, указанный пользователем в списке «@param». - person foxwendy; 30.05.2017
comment
Ты прав. Я открыл задачу здесь: github.com/googledatalab/pydatalab/issues/395. - person yelsayed; 30.05.2017
comment
Это исправлено на Github. Вы можете либо дождаться выхода следующего релиза, либо клонировать и использовать исправленный код вручную. - person yelsayed; 30.05.2017
comment
супер. когда будет следующий выпуск? - person foxwendy; 05.06.2017
comment
Вы можете получить образ ежедневной сборки, потянув gcr.io/cloud-datalab/datalab:local-20170605, обратите внимание, однако, что это не выпущенная сборка, поэтому используйте ее на свой страх и риск. - person yelsayed; 06.06.2017