Структура BigQuery как возвращение UDF: привет, вопрос мирового уровня - PullRequest
0 голосов
/ 04 октября 2018

Я хотел бы использовать структуру в качестве типа возврата из UDF, а затем извлечь отдельные поля из результатов.Вот моя попытка найти вариант использования Hello World:

create temp function udf_struct_test(orig string)
returns struct<original int64, plus1 int64>
language js as """

var original = parseInt(orig);
var plus1 = 1 + original;
return { original, plus1 };

""";

with t as ( select udf_struct_test(cast (input as string)) from unnest([1,2,3,4,5]) input )
select t.original, t.plus1 from t ;

результат:

Error: Name original not found inside t at [10:10]

, но когда я изменяю выбор на «select * from t»,Я получаю:

Row f0_.original    f0_.plus1    
1   1   2    
2   2   3    
3   3   4    
4   4   5    
5   5   6

Я потратил смущающе много времени, пытаясь заставить это работать, и я предполагаю, что мне не хватает чего-то очень маленького / глупого ... верно?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вот альтернативная версия вашего решения, которая проецирует поля структуры, возвращаемые UDF, в виде столбцов:

with t as (
  select as value udf_struct_test(cast(input as string))
  from unnest([1,2,3,4,5]) input
)
select original, plus1
from t ;

Или используйте .* в возвращаемой структуре:

with t as (
  select udf_struct_test(cast(input as string)).*
  from unnest([1,2,3,4,5]) input
)
select original, plus1
from t ;
0 голосов
/ 04 октября 2018

Обновление: да, это что-то крошечное / тупое, как я и думал.

Я пытался отстранить источник строки, когда я действительно хотел разыменовать столбец в источнике строки.Таким образом, все, что требуется для этой работы - это псевдоним результата UDF внутри подзапроса.Т.е. (обратите внимание на псевдонимы "v"):

with t as ( select udf_struct_test(cast(input as string)) v from unnest([1,2,3,4,5]) input )
select v.original, v.plus1 from t ;

derp.

Любой, кто думает о мета-материалах stackoverflow, пожалуйста, не стесняйтесь удалять весь этот пост, если вы не думаетеэто обеспечивает любое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...