10分钟教你掌握BigQuery语法

2023-10-27

BigQuery(以下简称BQ)的CRUD操作都可以通过SQL指令來完成

Create: SQL INSERT statement
Read: SQL SELETE statement
Update : SQL UPDATE/MERGE, 虽然Bigquery支持update。但这毕竟是资料分析的 solution。建议还是不要经常做。
Delete: SQL DELETE

因为是资料分析的工具,因此用最多的就是"Read"的功能。现行BigQuery 支持SQL:2011的语法。

以下我们使用一個例子,如下图。进入到BQ后我们使用BQ的公开资料,我们使用的公开资料为纽约市的自行车租赁资料。

一开始我们可以检视我们所要分析的资料,在BQ的左下表列(如图一),你会看到BQ的公开资料 bigquery-public-data,这些都是BQ公开可以分析的资料。

图一


这里说明一下BQ的资料库结构: 
第一层是project name,在这里project ID就是 bigquery-public-data
第二层是 dataset name ,在这里dataset name 就是 new_york_citibike(如图二)
第三层是 table name,在这里table name就是citibike_stations及citibike_trips(如图二)

 

图二

 

图三

 图四 

接下来我们检视一下我们所要分析的资料,在BQ的每一个table中我们 都可以看到schema/Details/Preview这三项资料(如图二到四)。

schema–这一段就是BQ这一个table的schema,就跟你是使用一般的资料库一样的结构。
Details –这一部分对你来说比较重要的资讯,这个table的大小与资料的总比数。
Preview —顾名思义可以预览这个table的内容资料。

首先我们先对这一个citibike_trips table做简单的查询,语法如下:
这里要特别提一下 from之后的资料来源。BQ需要指定完整资料来源路径,之前有提到BQ的资料库有三层结构。所以完整路经的名称规则为
ProjectID.DataSetName.TableName
这个范例中project ID 有 这个符号是因为BQ无法辨认含有 - 符号的名称。所以需要用单引号把project ID框起来。

select

  gender, tripduration

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

  limit 5

图五 

如图五所示,我们select gender / tripduration这两个栏位,并show出5笔资料。在这边我们可以看到。BQ在您输入SQL语法时就会帮你验证语法的正确性,若语法不正确BQ就会show出红色的警告标示而不会是如上图的绿色的验证成功的图示。同时,在右手边你可以看到这一次资料处理量。BQ的收费标准是以“资料储存量”与“资料处理量”作为收费标准。也可以看到这一次的查询BQ使用了多少时间处理,这一次处理759MB的资料花了 0.5秒的时间.

使用过一般传统的RDBMS的朋友都知道,join table是经常要做的事但这个动作会让资料库效能低下。由于BQ的特性,我们强烈建议您若要将RDBMS的资料汇入到BQ中请将您的RDBMS资料做denormalized form。

第二个例子,将栏位做别名。范例如下:

select

  gender, tripduration as rental_duration

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

  limit 5

这时我们会看到底下的栏位名称已经被更改,当然我们也可以对栏位做计算,但这个计算的栏位若不给它别名,那BQ就会自动给出一个别名。范例如下:

select

  gender, tripduration/60

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

  limit 5

综合上面的两个例子,语法如下:

select

  gender, tripduration/60 as duration_minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

  limit 5

 

使用 “where”语法,可以包含Boolean条件來做filter,范例如下:

select

  gender, tripduration/60 as duration_minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

where tripduration < 600

  limit 5

 

这个范例我们只要 tripduration小于600秒的,我们也可以在增加一些filter的选项。范例如下:

select

  gender, tripduration/60 as duration_minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

where tripduration >=300 and tripduration < 600 and gender = ‘female’

  limit 5

 

上面这个范例我们使用了多个条件来filter并用AND。此范例我们要小于600秒并大于等于300秒且是女性的资料。

当然也可以用 and not来排除我们不需要的条件,例如:

select

  gender, tripduration/60 as duration_minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

where tripduration < 600 and not gender = ‘female’

  limit 5

 

 上面的范例中,我们filter小于600秒并且不是女性的租借者的资料,另外我们也可以在where条件下再次做filter,范例如下:

select

  gender, tripduration/60 as duration_minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

where (tripduration < 600 and not gender = ‘female’) or gender = ‘male’

  limit 5

这格范例中,我们使用or 。filter的资料是(小于600秒而且不是女性的) 或是男性,因为性别栏位中的资料可能有unknow的存在。另外要说明一下where的栏位资料必须是实际存在的栏位而不是别名名称。以之前的别名范例来说应该如下写法:

select

  gender, tripduration/60 as minutes

from

  `bigquery-public-data`.new_york_citibike.citibike_trips

where (tripduration / 60) < 10

  limit 5

在BQ方案中, select * 整个table 是强烈建议不要做的,因为效能会非常差而且刚刚提过BQ的计费方式是以资料处理量来计费,经常select * 整个资料库会让你的费用爆增。除了select * 整个资料库外,我们也可以用except来排除我们不要分析的栏位。这样就可以把费用在降低。范例如下:

select

  * except(short_name, last_reported)

from

  `bigquery-public-data`.new_york_citibike.citibike_stations

where name like ‘%Riverside%’

在上面的范例,我们依然使用了select * ,但我们使用了except排除了我们不要分析的栏位。

我们也可以用replace来替原来的资料做计算,范例如下:

select

  * replace(num_bikes_available + 5 as num_bikes_available)

from

  `bigquery-public-data`.new_york_citibike.citibike_stations

上面的范例中,我们只对 num_bikes_available这个栏位做计算,而计算后的栏位可以一样是同样的名称,并不会影响原来的原始资料。

使用WITH做 Subqueries,一般的query,我们可以是这样的写法:

select * from (

  select

    gender, tripduration /60 as minutes

  from

    `bigquery-public-data`.new_york_citibike.citibike_trips

)

where minutes < 10

limit 5

这个select *的inner query的别名是发生在 select里面的。若是这个inner query的结果是我们经常要的。那重复这一个SQL statement 就变得很麻烦.这时我们可以使用WITH来替代。范例如下:

with all_trips as(

  select

    gender, tripduration /60 as minutes

  from

    `bigquery-public-data`.new_york_citibike.citibike_trips

)

select * from all_trips

where minutes < 10

limit 5

从这例子我们可以看到,我们把要经常使用的subquery使用WITH来替代,这时候在 with裡的query结果就可以被外部其他query所使用。

最后我们介绍Order by,这应该是经常使用 SQL语法的人最熟悉的了。
范例如下:

select

    gender, tripduration /60 as minutes

  from

    `bigquery-public-data`.new_york_citibike.citibike_trips

where gender = ‘female’

order by minutes DESC

limit 5

在BQ中,rows是不排序的。若使用order by而没有指定的话,预设是Descending.

以上是一些BQ CRUD指令的简单介绍,下一篇我们将在深入複杂的SQL语法应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

10分钟教你掌握BigQuery语法 的相关文章

随机推荐

  • 【程序员面试金典】找出缺失的整数

    题目描述 数组A包含了0到n的所有整数 但其中缺失了一个 对于这个问题 我们设定限制 使得一次操作无法取得数组number里某个整数的完整内容 唯一的可用操作是询问数组中第i个元素的二进制的第j位 最低位为第0位 该操作的时间复杂度为常数
  • 项目打包工具使用教程(innosetup)

    夏季小学期的时候用VS2015敲了一个关于WinForm的项目 和C 类似 项目完成之后想把它发布成一个可以在win10系统里直接的程序 而且最好有和我们平时安装软件一样 一步步选择 效果图 首先下载innosetup 网址 https p
  • 转载:MATLAB R2018b 安装教程

    MATLAB R2018b 安装教程 LegendLYC 2019 03 26 22 21 50 46687 收藏 116 分类专栏 安装教程 div class div
  • Java实现:猴子吃桃问题

    Java实现 猴子吃桃问题 文章目录 Java实现 猴子吃桃问题 1 问题 2 解决方案 3 实现代码 4 执行结果 5 解决方法说明 穷举法 1 问题 猴子吃桃问题 有一只猴子第一天摘下若干个桃子 当即吃掉了一半 又多吃了一个 第二天又将
  • TypeError:__init__() got an unexpected keyword argument 'xxx'

    如上图所示 出现此类问题通常是打错了一些英文
  • 浙大PAT 2-13. 两个有序序列的中位数 (解题思路)

    2 13 两个有序序列的中位数 时间限制 40 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A0 A1 AN 1的
  • 关于如何自定义docker的网络网段

    在修改docker的网段前 请务必关闭所有正在运行中的容器 编辑文件 etc docker daemon json 如果没有则需要创建 cat daemon json default address pools base 172 40 0
  • Powershell - 环境设置

    PowerShell 图标可以在任务栏和开始菜单中找到 只需点击图标 它就会打开 要打开它 只需单击图标 然后将打开以下屏幕 这意味着 PowerShell 已准备好供你使用 PowerShell 版本 最新版本的 PowerShell 是
  • JDK多版本配置及切换版本不生效问题解决

    一 准备工作 首先你要有多个版本的jdk 如果没有请移至 https www oracle com java technologies downloads 下载 具体下载方法可参考 Java同学入职环境安装全讲解 二 配置环境变量 在环境变
  • es6 实现数组的操作

    1 实现数组的去重 1 1 方法一 let arr id 1 name aa id 2 name bb id 3 name cc id 4 name dd id 5 name ee id 1 name aa id 1 name aa id
  • 医疗产业数字化转型现况及方向

    报告以医疗产业的各种应用场景为切入点 分析不同场景下数字化转型程度和路径 通过对医疗产业数字化整体发展现况的解析 探讨医疗产业链中数字化场景应用所带来的机遇及相应挑战 基于已描绘的医疗产业链数字化转型图谱 挖掘在医疗数字化转型浪潮中做出突出
  • 被问 Linux 命令 su 和 sudo 的区别?当场蒙了!

    tanjuntao github io 之前一直对 su 和 sudo 这两个命令犯迷糊 最近专门搜了这方面的资料 总算是把两者的关系以及用法搞清楚了 这篇文章来系统总结一下 1 准备工作 因为本篇博客中涉及到用户切换 所以我需要提前准备好
  • idea插件生成dao类service类controller类以及mapper.xml

    idea插件生成dao类service类controller类以及mapper xml 安装插件Easycode和MybatisX 不用自己写代码 1 Files Settings Plugins 分别搜索Easycode和MybatisX
  • Redis 持久化之 RDB 与 AOF 详解

    Redis 持久化 我们知道Redis的数据是全部存储在内存中的 如果机器突然GG 那么数据就会全部丢失 因此需要有持久化机制来保证数据不会因为宕机而丢失 Redis 为我们提供了两种持久化方案 一种是基于快照 另外一种是基于 AOF 日志
  • Mysql Group Replication 简介及单主模式组复制配置

    一 Mysql Group Replication简介 Mysql Group Replication MGR 是一个全新的高可用和高扩张的MySQL集群服务 高一致性 基于原生复制及paxos协议的组复制技术 以插件方式提供一致数据安全保
  • 在使用命令行环境下Scala读取输入内容时,输入内容不显示问题(未解决)

    在使用命令行环境下Scala读取输入内容时 输入内容不显示问题 如下图 使用键盘输入任意内容但是命令行没有显示任何内容 但是内容又是可以输出的 怀疑是被默认隐藏了 输出结果是如此 我不知道这是本来就这样还是我自己的问题 希望能有大佬可以答疑
  • 前台商品列表接口

    前台商品列表接口 搜索功能 1 入参判空 2 加 通配符 3 sql语句like关键字 平铺展示该商品类别及其子类别下的所有商品 排序功能 测试 查询 排序 按照类别展示该类别和他子类别下的所有商品 查询类别3和他所有子类别的商品 cont
  • 带你搞懂 Redis 中的两个策略

    面试的时候问到候选人 Redis 相关问题时 发现一个现象 一部分候选人分不清 Redis 的 键过期策略 和 内存淘汰策略 今天就来说一说这老哥俩 简单来说 过期策略就是当 key 到了指定的过期时间后 Redis 是用什么方式将其删除的
  • Python+Vue计算机毕业设计火灾与警情统计系统24b58(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • 10分钟教你掌握BigQuery语法

    BigQuery 以下简称BQ 的CRUD操作都可以通过SQL指令來完成 Create SQL INSERT statement Read SQL SELETE statement Update SQL UPDATE MERGE 虽然Big