首页 > 数据库 > > BigQuery:如何查询数据
在之前的BigQuery教程中,我们介绍了BigQuery体系结构,存储管理,以及将数据提取到BigQuery中。在本文中,我们将介绍使用SQL在BigQuery中查询数据,保存和共享查询,创建视图和实例化视图。
BigQuery支持两种SQL方言:标准SQL和旧式SQL。标准SQL是查询BigQuery中存储的数据的首选,因为它符合ANSI SQL 2011标准。与旧版SQL相比,它还有其他优点,例如JOIN操作的自动谓词下推以及对相关子查询的支持。有关更多信息,请参见标准SQL优点。
在BigQuery中运行SQL查询时,它会自动创建,安排和运行查询作业。BigQuery以两种模式运行查询作业: 交互(默认)和批量。
除非另有说明,否则本文中的查询均遵循标准SQL方言并以交互模式运行。
BigQuery中的每个表格均由列名称,数据类型和其他元数据定义。BigQuery支持以下表格类型:

在BigQuery中,架构是在表级别定义的,并为数据提供结构。架构描述列定义及其名称,数据类型,描述和模式。
ARRAY和STRUCTNULLABLE , REQUIRED或REPEATED 。在将数据加载到表中或创建空表时,可以指定表架构。或者,在加载数据时,您可以使用自动检测来识别源数据格式,也可以在JSON文件中定义架构,如图所示。
[
{
"description": "[DESCRIPTION]",
"name": "[NAME]",
"type": "[TYPE]",
"mode": "[MODE]"
},
{
"description": "[DESCRIPTION]",
"name": "[NAME]",
"type": "[TYPE]",
"mode": "[MODE]"
}
]现在,让我们分析与NCAA篮球比赛相关的公共BigQuery数据集。比赛数据涵盖了从2009年至今的每场比赛得分。我们将查看2014赛季肯塔基州野猫队和巴黎圣母院爱尔兰人之间的特定比赛。
在BigQuery控制台中,搜索NCAA Basketball数据集,点击“查看数据集”按钮,然后在BigQuery Web UI中打开数据集。

导航到ncaa_basketball数据集下的mbb_pbp_sr ,查看模式。该表具有2013-2014赛季所有男篮比赛的逐项比赛信息,该表中的每一行代表一场比赛中的单个事件。

mbb_pbp_sr表详情页面显示,表包含约400万个比赛事件,总容量约为3GB。

让我们运行一个查询来过滤我们感兴趣的比赛事件。该查询从mbb_pbp_sr表中选择以下列:
game_clock:比赛剩余时间points_scored :得分team_name :得分的球队名称event_description :有关事件的描述timestamp :事件发生的时间SELECT
game_clock,
points_scored,
team_name,
event_description
FROM
`bigquery-public-data.ncaa_basketball.mbb_pbp_sr`
WHERE
season = 2014
AND home_name = 'Wildcats'
AND away_name = 'Fighting Irish'
AND points_scored IS NOT NULL
ORDER BY
timestamp DESC
LIMIT 10;查询结果如下:

从结果看,球员安德鲁·哈里森(Andrew Harrison)罚球两次,得到2分,比赛还剩6秒。除了在比赛结束时获得分数以外,这并不能告诉我们太多。
提示:避免在查询中SELECT * ,而是仅查询所需的列。
让我们使用分析函数修改查询,获取截止至到比赛结束前每只队伍的累计得分。
SELECT
game_clock,
SUM(
CASE
WHEN team_name = 'Wildcats' THEN points_scored
END
) OVER(ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS wildcats_score,
SUM(
CASE
WHEN team_name = 'Fighting Irish' THEN points_scored
END
) OVER(ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS fighting_irish_score,
team_name,
event_description
FROM
`bigquery-public-data.ncaa_basketball.mbb_pbp_sr`
WHERE
season = 2014
AND home_name = 'Wildcats'
AND away_name = 'Fighting Irish'
AND points_scored IS NOT NULL
ORDER BY
timestamp DESC
LIMIT 10;查询结果如下:

我们可以看到比赛是如何结束的,比赛还剩04:28时,爱尔兰格斗队以4分优势领先,随后野猫队的Karl-Anthony Towns在最后的01:12扳平比分,而安德鲁·哈里森在终场前6秒罚中两球,为野猫队的获胜奠定基础。这的确是一个振奋人心的结局。
如图所示,除了聚合和分析函数外,BigQuery还支持函数和运算符,例如字符串操作,日期/时间,数学函数,JSON提取等。

有关函数的完整列表,可以参阅BigQuery SQL函数。
在后台运行SQL查询时,它会执行以下操作:
BigQuery SQL查询的生命周期 * BigQuery引擎利用BigQuery的列存储格式来仅扫描运行查询所需的列。控制成本的最佳实践之一是仅查询所需的列。 * 查询执行完成后,查询服务会将结果保存到临时表中,然后Web UI会显示该数据。您还可以请求将结果写入永久表。

既然您已经运行了SQL查询来执行分析,那么如何保存这些结果? BigQuery将所有查询结果写入表。用户将该表明确标识为目标表或临时缓存的结果表。该临时表将存储24小时,因此,如果您再次运行完全相同的查询(完全匹配字符串),并且结果不会有所不同,则BigQuery只会返回指向缓存结果的指针。可以从缓存中提供的查询不会产生任何费用。
您可以从BigQuery UI的“查询历史记录”选项卡中查看缓存的查询结果。此历史记录包括您向服务提交的所有查询,而不仅仅是通过Web UI提交的查询。

执行查询时,可以从查询设置中禁用检索缓存的结果。这需要BigQuery计算查询结果,这将导致查询产生费用。这通常用于基准测试方案中,例如在上一篇文章中比较了分区表和群集表与未分区表的性能。
您还可以请求将查询写入目标表。您可以控制何时删除表。由于目标表是永久性的,因此需要为存储结果付费。
BigQuery允许您与他人共享查询。保存查询时,查询可以是私有的(仅对您可见),在项目级别共享(对项目成员可见)或公共(任何人都可以查看)。
视图是由SQL查询定义的虚拟表。视图的属性类似于表,可以作为表查询。视图的架构是运行查询所产生的架构。该视图的查询结果仅包含来自定义该视图的查询中指定的表和字段的数据。
你可以通过使用“保存视图”按钮或使用BigQuery的DDL创建视图。将查询另存为视图不会保留结果,除了将数据缓存到临时表(该表在24小时窗口内到期)之外。该行为类似于在表上执行的查询。

BigQuery支持实体化视图(Materialized Views)。MV是预先计算的视图,可定期缓存查询结果以提高性能和效率。与仅从基表检索相同数据的查询相比,使用MV的查询通常更快,消耗的资源更少。通过常见和重复的查询,它们可以显着提高工作负载的性能。

以下是实例化视图的主要功能:
零维护
BigQuery利用MV预先计算的结果,并尽可能从基表中读取增量变化以计算最新结果。它会自动将数据刷新与基表中的数据更改同步,无需用户输入。您还可以选择触发手动刷新视图以控制刷新作业的成本。
自动更新
MV始终与源表一致,可以直接查询它们,也可以由BigQuery优化器使用它们来处理对基表的查询。
智能调优
MV支持查询重写。如果可以通过查询MV来解决针对源表的查询,则BigQuery会将查询重写(重新路由)到MV,以提高性能和/或效率。
在本文中,我们回顾了BigQuery中SQL查询的生命周期,使用窗口函数,创建标准视图和实例化视图,保存和共享查询。
参考
Codelab
https://zhuanlan.zhihu.com/p/366532868
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69999831/viewspace-3138484/ ,如需转载,请注明出处,否则将追究法律责任。