Sql BigQuery如何管理SELECT中的结构字段
以下内容从公共数据源查询结构:Sql BigQuery如何管理SELECT中的结构字段,sql,struct,google-bigquery,Sql,Struct,Google Bigquery,以下内容从公共数据源查询结构: SELECT year FROM `bigquery-public-data.words.eng_gb_1gram` LIMIT 1000 其模式为: 结果集是: 似乎BigQuery在访问时会自动将结构转换为其所有(叶)字段,对吗?或者BigQuery如何处理在select语句中直接调用结构的问题?有两件事正在进行。您有一个结构数组(也称为“记录”) 数组的每个元素都显示在结果集中的单独一行上 结构中的每个字段都是一个单独的列 因此,您的结果不是针对一
SELECT year FROM `bigquery-public-data.words.eng_gb_1gram` LIMIT 1000
其模式为:
结果集是:
似乎BigQuery在访问时会自动将结构转换为其所有(叶)字段,对吗?或者BigQuery如何处理在select语句中直接调用结构的问题?有两件事正在进行。您有一个结构数组(也称为“记录”)
- 数组的每个元素都显示在结果集中的单独一行上
- 结构中的每个字段都是一个单独的列
select year[safe_ordinal(1)]
from . . .
您将为数据中的每一行获得一行,该行中包含年
数组的第一个元素。它将有单独的列,名称为year.year
,year.term\u frequency
等等。如果希望将这些列作为“常规”列,可以使用:
select year[ordinal(1)].*
from . . .
然后列是年份、术语频率等等。您有一个结构数组(也称为“记录”)
- 数组的每个元素都显示在结果集中的单独一行上
- 结构中的每个字段都是一个单独的列
select year[safe_ordinal(1)]
from . . .
您将为数据中的每一行获得一行,该行中包含年
数组的第一个元素。它将有单独的列,名称为year.year
,year.term\u frequency
等等。如果希望将这些列作为“常规”列,可以使用:
select year[ordinal(1)].*
from . . .
然后,列是
year
,term\u frequency
,等等。您可能知道-记录可以为空-在这种情况下,它是一个结构,记录可以重复-在这种情况下,它是一个记录数组
您可以在结构中使用点开始概念来选择它的所有字段,就像您在表的单个行中使用select*FROM tbl
或其等效的select t.*FROM tbl t
例如,下面的代码
with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct,
[ struct(11 as x, 12 as y, 13 as z),
struct(21, 22, 23),
struct(31, 32, 33)
] as col_array
)
select col_struct.*
from tbl
产生
就像那些是名为col\u struct
相同的点星概念-不适用于数组-如果您想单独输出数组元素-您需要首先取消对该数组的测试。就像下面的例子
with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct,
[ struct(11 as x, 12 as y, 13 as z),
struct(21, 22, 23),
struct(31, 32, 33)
] as col_array
)
select rec
from tbl, unnest(col_array) rec
哪个输出
现在,因为每一行都是一个结构,所以可以使用点星概念
select rec.*
from tbl, unnest(col_array) rec
有输出
最后,您可以将上述内容组合为
select col_struct.*, rec.*
from tbl t, t.col_array rec
有输出
注意:from tbl t,t.col\u array rec
是从tbl,unest(col\u array)rec
还有一个注意事项——如果您引用在模式的多个位置使用的字段名,那么引擎将选择最外部的匹配字段。如果这个匹配的数组碰巧在数组中,那么首先需要取消对该数组的测试。如果这是STRUCT的一部分,则需要确保完全限定路径
例如,使用上述简化数据
select a from tbl // will not work
select col_struct.a from tbl // will work
select col_array.x from tbl // will not work
select x from tbl, unnest(col_array) // will work
基于您的用例,可以对主题进行更多的描述-但上面是一些有希望的有用基础知识,您可能知道-记录可以为空-在这种情况下,它是一个结构,记录可以重复-在这种情况下,它是一个记录数组 您可以在结构中使用点开始概念来选择它的所有字段,就像您在表的单个行中使用
select*FROM tbl
或其等效的select t.*FROM tbl t
例如,下面的代码
with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct,
[ struct(11 as x, 12 as y, 13 as z),
struct(21, 22, 23),
struct(31, 32, 33)
] as col_array
)
select col_struct.*
from tbl
产生
就像那些是名为col\u struct
相同的点星概念-不适用于数组-如果您想单独输出数组元素-您需要首先取消对该数组的测试。就像下面的例子
with tbl as (
select struct(1 as a, 2 as b, 3 as c) as col_struct,
[ struct(11 as x, 12 as y, 13 as z),
struct(21, 22, 23),
struct(31, 32, 33)
] as col_array
)
select rec
from tbl, unnest(col_array) rec
哪个输出
现在,因为每一行都是一个结构,所以可以使用点星概念
select rec.*
from tbl, unnest(col_array) rec
有输出
最后,您可以将上述内容组合为
select col_struct.*, rec.*
from tbl t, t.col_array rec
有输出
注意:from tbl t,t.col\u array rec
是从tbl,unest(col\u array)rec
还有一个注意事项——如果您引用在模式的多个位置使用的字段名,那么引擎将选择最外部的匹配字段。如果这个匹配的数组碰巧在数组中,那么首先需要取消对该数组的测试。如果这是STRUCT的一部分,则需要确保完全限定路径
例如,使用上述简化数据
select a from tbl // will not work
select col_struct.a from tbl // will work
select col_array.x from tbl // will not work
select x from tbl, unnest(col_array) // will work
根据您的具体用例,关于主题还有很多可以说的-但以上是一些希望有用的基础知识您似乎遗漏了yout comment中的一些行。您似乎遗漏了yout comment中的一些行。我明白了,但忽略了数组项,在select表达式中使用
year
是否与year.*
?@David542<代码>年份。*在您的情况下不起作用,因为year
是一个数组。如果它只是一个结构,那么year
将返回一个带有列的“嵌套”结构,year.
将字段作为单独的列返回。它似乎删除了外部结构名称空间,但在其他方面对非嵌套结构的作用相同:使用tbl作为(选择struct(12345作为street,struct('Bloom'作为名称,90025作为邮政编码)作为城市,'USA'作为国家)作为地址)选择address.*,tbl中的address
是否准确?如果使用address.*
,则会发生这种情况。如果只使用address
,则会在名称中获得address.
。我知道,但忽略数组项,在选择表达式中使用year
是否与year.
做相同的事情?@David542。.year.*
在您的情况下不起作用,因为year
是一个数组