UDF返回的BigQuery结构:您好,世界质量问题

时间:2018-10-04 16:14:26

标签: google-bigquery

我想使用结构作为UDF的返回类型,然后从结果中提取单个字段。这是我尝试的用例的世界版本:

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]

但是,当我将选择更改为“从t中选择*”时,我得到:

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

我花了很长时间尴尬地尝试使它生效,我想我想念的东西很小/很愚蠢……对吗?

2 个答案:

答案 0 :(得分:2)

更新:是的,这有点像我想的那样小/笨。

当我真的想取消引用行源中的列时,我试图引用行源。因此,要做到这一点,所需要做的就是在子查询中为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元数据有意见的人,如果您认为这篇文章没有任何价值,请随时删除整篇文章。

答案 1 :(得分:2)

这是您的解决方案的替代版本,将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 ;