BigQuery Clustered Table 简介 - 聚簇表

Clustered Table的定义

聚簇可以提高某些类型的查询(例如,使用过滤条件子句的查询和聚合数据的查询)的性能。当通过查询作业或加载作业将数据写入聚簇表时,BigQuery 会使用聚簇列中的值对这些数据进行排序。这些值用于将数据整理到 BigQuery 存储的多个块中。当您提交的查询包含基于聚簇列过滤数据的子句时,BigQuery 会使用已排序的块来避免扫描不必要的数据。 如果表或分区低于 1 GB,则聚簇表和未聚簇表之间的查询性能可能不会有显著差异。

以下是创建聚簇表的示例:

CREATE TABLE dataset.clustered_table
(column1 INT64,column2 STRING,column3 DATE,...
)
CLUSTER BY column1;

在上面的示例中,通过将column1列指定为聚簇键,dataset.clustered_table将按照column1的值进行排序和分组。

值得注意的是,创建聚簇表是一个一次性的操作,无法在表创建后更改聚簇键。如果需要更改聚簇键,您需要创建一个新的聚簇表并将数据导入其中。

通俗点来讲, Clustered表就是存放数据会已 设定的 字段来排序, 这样以这个字段来做filter 就不用全表扫描了(2分法?), 跟索引的原理类似。

还有 Clustered 表和分区表 并不冲突, 1张表既可以分区 也可以 Cluster , 不过如何分区和Cluster 都是同1个列的我觉得意义不大, 如果是两个不同的field的话代表查询时要同时加上这个两个field的filter, 总之看实际需求!




准备测试数据

本码农发文从不只发定义, 既然上面说了大数量量才有效果, 我们就准备个大的

[gateman@manjaro-x13 chapter-02]$ ls -lh 
total 401M
-rw-r--r-- 1 gateman gateman 401M Dec 24 01:24 automobiles.csv
-rwxrwxrwx 1 gateman gateman 2.7K May  5  2022 chapter-02-steps.sql
-rwxrwxrwx 1 gateman gateman  250 May  5  2022 link_to_automobiles_dataset.txt
[gateman@manjaro-x13 chapter-02]$ head automobiles.csv 
maker,model,mileage,manufacture_year,engine_displacement,engine_power,body_type,color_slug,stk_year,transmission,door_count,seat_count,fuel_type,date_created,date_last_seen,price_eur
ford,galaxy,151000,2011,2000,103,,,None,man,5,7,diesel,2015-11-14 18:10:06.838319+00,2016-01-27 20:40:15.46361+00,10584.75
skoda,octavia,143476,2012,2000,81,,,None,man,5,5,diesel,2015-11-14 18:10:06.853411+00,2016-01-27 20:40:15.46361+00,8882.31
bmw,,97676,2010,1995,85,,,None,man,5,5,diesel,2015-11-14 18:10:06.861792+00,2016-01-27 20:40:15.46361+00,12065.06
skoda,fabia,111970,2004,1200,47,,,None,man,5,5,gasoline,2015-11-14 18:10:06.872313+00,2016-01-27 20:40:15.46361+00,2960.77
skoda,fabia,128886,2004,1200,47,,,None,man,5,5,gasoline,2015-11-14 18:10:06.880335+00,2016-01-27 20:40:15.46361+00,2738.71
skoda,fabia,140932,2003,1200,40,,,None,man,5,5,gasoline,2015-11-14 18:10:06.894643+00,2016-01-27 20:40:15.46361+00,1628.42
skoda,fabia,167220,2001,1400,74,,,None,man,5,5,gasoline,2015-11-14 18:10:06.915376+00,2016-01-27 20:40:15.46361+00,2072.54
bmw,,148500,2009,2000,130,,,None,auto,5,5,diesel,2015-11-14 18:10:06.924123+00,2016-01-27 20:40:15.46361+00,10547.74
skoda,octavia,105389,2003,1900,81,,,None,man,5,5,diesel,2015-11-14 18:10:06.936239+00,2016-01-27 20:40:15.46361+00,4293.12
[gateman@manjaro-x13 chapter-02]$ wc -l automobiles.csv 
3552913 automobiles.csv
[gateman@manjaro-x13 chapter-02]$

如上图, 有个automobile.csv 的测试数据集
400 多MB
355万行

用libreOffice 打开这个csv 直接提示数据函数超过了1,048,576的上限(2的20次方), 只能打开1,048,576 部分的数据。
别笑, 微软的Excel也是这个上限, 而且LibreOffice 还能对这个1,048,576 正常作处理。

在这里插入图片描述

LibreOffice 的确神器, 相比之下另1个office 软件 OnlyOffice 直接报错内存不够。




上传数据表到BigQuery

[gateman@manjaro-x13 chapter-02]$ bq load --autodetect --source_format=CSV DS2.automobile_o automobiles.csv Updates are available for some Google Cloud CLI components.  To install them,
please run:$ gcloud components update/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Upload complete.
Waiting on bqjob_r3a61ac818de36f56_0000018c97cbb415_1 ... (12s) Current status: DONE   
[gateman@manjaro-x13 chapter-02]$ bq show DS2.automobile_o
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Table jason-hsbc:DS2.automobile_oLast modified                Schema                Total Rows   Total Bytes   Expiration   Time Partitioning   Clustered Fields   Total Logical Bytes   Total Physical Bytes   Labels  ----------------- --------------------------------- ------------ ------------- ------------ ------------------- ------------------ --------------------- ---------------------- -------- 24 Dec 01:51:31   |- maker: string                  3552912      305423773                                                         305423773             71803365                       |- model: string                                                                                                                                                      |- mileage: integer                                                                                                                                                   |- manufacture_year: integer                                                                                                                                          |- engine_displacement: integer                                                                                                                                       |- engine_power: integer                                                                                                                                              |- body_type: string                                                                                                                                                  |- color_slug: string                                                                                                                                                 |- stk_year: string                                                                                                                                                   |- transmission: string                                                                                                                                               |- door_count: string                                                                                                                                                 |- seat_count: string                                                                                                                                                 |- fuel_type: string                                                                                                                                                  |- date_created: timestamp                                                                                                                                            |- date_last_seen: timestamp                                                                                                                                          |- price_eur: float                                                                                                                                                   

这样我们就得到1个355万行的非分区和非clustered的表. 表名: automobile_o




创建1个具有相同数据的Cluster表

需求是, 我想这个Clustered表的是按maker, manufacture_year (厂家和生产年份) 来排序存储的.

方法1: 使用bq command 上传多次, 但是加上–clustering_fileds 的参数

[gateman@manjaro-x13 chapter-02]$ bq load --autodetect --source_format=CSV --clustering_fields=maker,manufacture_year DS2.automobile_c automobiles.csv
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Upload complete.
Waiting on bqjob_r1b1de085f8ee2e04_0000018c982d988a_1 ... (10s) Current status: DONE   
[gateman@manjaro-x13 chapter-02]$ bq show DS2.automobile_c
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Table jason-hsbc:DS2.automobile_cLast modified                Schema                Total Rows   Total Bytes   Expiration   Time Partitioning      Clustered Fields       Total Logical Bytes   Total Physical Bytes   Labels  ----------------- --------------------------------- ------------ ------------- ------------ ------------------- ------------------------- --------------------- ---------------------- -------- 24 Dec 03:38:30   |- maker: string                  3552912      305423773                                      maker, manufacture_year   305423773                                            |- model: string                                                                                                                                                             |- mileage: integer                                                                                                                                                          |- manufacture_year: integer                                                                                                                                                 |- engine_displacement: integer                                                                                                                                              |- engine_power: integer                                                                                                                                                     |- body_type: string                                                                                                                                                         |- color_slug: string                                                                                                                                                        |- stk_year: string                                                                                                                                                          |- transmission: string                                                                                                                                                      |- door_count: string                                                                                                                                                        |- seat_count: string                                                                                                                                                        |- fuel_type: string                                                                                                                                                         |- date_created: timestamp                                                                                                                                                   |- date_last_seen: timestamp                                                                                                                                                 |- price_eur: float   

方法2: 用sql 基于已存在的表创建

create table DS2.automobile_c2
cluster by maker, manufacture_year
as 
select * from DS2.automobile_o

效果是一样的

[gateman@manjaro-x13 chapter-02]$ bq show DS2.automobile_c2
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Table jason-hsbc:DS2.automobile_c2Last modified                Schema                Total Rows   Total Bytes   Expiration   Time Partitioning      Clustered Fields       Total Logical Bytes   Total Physical Bytes   Labels  ----------------- --------------------------------- ------------ ------------- ------------ ------------------- ------------------------- --------------------- ---------------------- -------- 24 Dec 03:38:04   |- maker: string                  3552912      305423773                                      maker, manufacture_year   305423773                                            |- model: string                                                                                                                                                             |- mileage: integer                                                                                                                                                          |- manufacture_year: integer                                                                                                                                                 |- engine_displacement: integer                                                                                                                                              |- engine_power: integer                                                                                                                                                     |- body_type: string                                                                                                                                                         |- color_slug: string                                                                                                                                                        |- stk_year: string                                                                                                                                                          |- transmission: string                                                                                                                                                      |- door_count: string                                                                                                                                                        |- seat_count: string                                                                                                                                                        |- fuel_type: string                                                                                                                                                         |- date_created: timestamp                                                                                                                                                   |- date_last_seen: timestamp                                                                                                                                                 |- price_eur: float                                                                                                                                                          




比较查询性能

我们已经同时具有 一般表 automobile_o 和 clustered 表automobile_c 接下来就是比较查询性能了
当然国际管理, 查询之前都必须禁用cache !
在这里插入图片描述







首先先检查表大小

[gateman@manjaro-x13 chapter-02]$ bq show DS2.automobile_o
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Table jason-hsbc:DS2.automobile_oLast modified                Schema                Total Rows   Total Bytes   Expiration   Time Partitioning   Clustered Fields   Total Logical Bytes   Total Physical Bytes   Labels  ----------------- --------------------------------- ------------ ------------- ------------ ------------------- ------------------ --------------------- ---------------------- -------- 24 Dec 01:51:31   |- maker: string                  3552912      305423773                                                         305423773             71803365                       |- model: string                                                                                                                                                      |- mileage: integer                                                                                                                                                   |- manufacture_year: integer                                                                                                                                          |- engine_displacement: integer                                                                                                                                       |- engine_power: integer                                                                                                                                              |- body_type: string                                                                                                                                                  |- color_slug: string                                                                                                                                                 |- stk_year: string                                                                                                                                                   |- transmission: string                                                                                                                                               |- door_count: string                                                                                                                                                 |- seat_count: string                                                                                                                                                 |- fuel_type: string                                                                                                                                                  |- date_created: timestamp                                                                                                                                            |- date_last_seen: timestamp                                                                                                                                          |- price_eur: float                                                                                                                                                   [gateman@manjaro-x13 chapter-02]$ bq show DS2.automobile_c
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13import pipes
Table jason-hsbc:DS2.automobile_cLast modified                Schema                Total Rows   Total Bytes   Expiration   Time Partitioning      Clustered Fields       Total Logical Bytes   Total Physical Bytes   Labels  ----------------- --------------------------------- ------------ ------------- ------------ ------------------- ------------------------- --------------------- ---------------------- -------- 24 Dec 03:38:30   |- maker: string                  3552912      305423773                                      maker, manufacture_year   305423773             66970872                       |- model: string                                                                                                                                                             |- mileage: integer                                                                                                                                                          |- manufacture_year: integer                                                                                                                                                 |- engine_displacement: integer                                                                                                                                              |- engine_power: integer                                                                                                                                                     |- body_type: string                                                                                                                                                         |- color_slug: string                                                                                                                                                        |- stk_year: string                                                                                                                                                          |- transmission: string                                                                                                                                                      |- door_count: string                                                                                                                                                        |- seat_count: string                                                                                                                                                        |- fuel_type: string                                                                                                                                                         |- date_created: timestamp                                                                                                                                                   |- date_last_seen: timestamp                                                                                                                                                 |- price_eur: float

可以看出两个表具有相同的schema, 相同的数据行和数据大小, 305423773 bytes = 291.27 MB




先看正常表 automobile_o
无论是select * from DS2.automobile_o 还是 select * from DS2.automobile_o where maker=‘bmw’

的处理数据都是291.27MB (全表处理) , 正常操作, 相当不省钱
在这里插入图片描述

好了, 下面对比查询clustered 表 DS2.automobile_c

在这里插入图片描述

当我们输入sql时, web_ui 预估的will process 数据还是291.27MB? 这是因为跟分区表不一样, bigquery在查询之前并不能准确预估clustered 表的预估数据。

因为分区表可以明白地根据查询条件得到sql 将在那几个表分区里查询, 而分区表存在多少个分区, 每个分区的数据行这些元数据BigQuery是清楚的, 其他无关表分区可以忽略

但是, clustered表的原理是数据按照某个or若干列的排序存放。

例如上面的sql条件是maker=‘bmw’, 在clustered表中的 所有bmw 的数据都应该存放一起, 但是BigQuery并没有这些数据的元数据, 例如bmw的数据有多少行, 大概占全表的什么位置, 这些数据都要执行知道才知道, 所以这里预估的will process就是全表了

但是,当我们执行这条数据后, 在真正的query信息得到实际处理的data 量是99 MB, Clustered 生效!

在这里插入图片描述

宝马毕竟是大厂, 如果查询条件换成冷门豪车阿士顿马田, 数据处理量会更加少
在这里插入图片描述

下一条sql
select * from DS2.automobile_c where manufacture_year<1994
在这里插入图片描述

结果还是全表扫描

因为虽然manufacture_year 也是clustered列的一部分, 但是存储排序是先拍maker 再排 manufacture_year, 如果只查询manufacture_year, 还是会导致全表扫描, 跟索引的最左原则一样。




结下来
两个列一齐查
在这里插入图片描述
跟只差maker 的处理数据量居然一样, 可能我的测试数据样本还不足够大的原因。




分区表和Clustered 一齐上

既然要查两个field
那么我就建1个 用manufacture_year 来分区, maker来cluster的表, 作为对比

首先查出 这个表的manufacture_year 的上下限
在这里插入图片描述

0 到2017

然后我们用下面的sql来建一张分区和clustered表 DS2.automobile_pc

create table DS2.automobile_pc
partition by Range_bucket(manufacture_year, generate_array(0,2017,10))
cluster by maker
as 
select * from DS2.automobile_o

在这里插入图片描述

这时 当我们输入sql时, bq 已经能预估分区后的will process数据是51.52MB了, 但是在这些分区, 相同maker的数据还是黏在一齐的, 也就是将bq不必要扫描每个完整表分区
在这里插入图片描述
我们执行它
在这里插入图片描述
可以看出最终只process了 37MB数据比预估的要少, 看来如果固定用两个field来查询的话, 用分区 + clustered 表的确很暴力有效!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web3风险投资公司之Electric Capital

文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网&#xff1a;https://www.electriccapital.com/ 官方github&#xff1a;https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…

【VB测绘程序设计】案例11—坐标正算的计算案例(附源码)

【VB测绘程序设计】案例11—坐标正算的计算案例(附源码) 文章目录 前言一、界面预览二、程序介绍三、程序源代码总结前言 ` VB程序在测绘领域应用广泛,能够解决一些常见的简单的计算问题,提高工作效率,本专栏持续更新常用的测绘计算,感谢关注。 坐标正算是已知边长和方位…

【Linux】进程管理

ps&#xff1a;报告当前进程快照。top&#xff1a;显示任务。kill&#xff1a;给一个进程发送信号。shutdown&#xff1a;关机或重启系统。 一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程&#xff0c;内核维护每个进程的信息&#xff0c;以此来保持事情有序…

基于YOLOv8深度学习的200种鸟类智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

DQL-基本查询

概念&#xff1a; 1&#xff0c;数据库管理系统一个重要功能就是数据查询&#xff0c;数据查询不应只是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示 2&#xff0c;MySQL提供了功能强大、灵活的语句来实现这些操作 3…

Unity手机移动设备重力感应

Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机&#xff0c;如下图竖屏的手机&#xff0c;如下图 一、引入 大家对重力感应应该都不陌生&#xff0c;之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念&#xff0c;根据手机的晃动来给实体…

Jmeter接口程序项目实战教程

1.什么是jmeter&#xff1f; JMeter是100%完全由Java语言编写的&#xff0c;免费的开源软件&#xff0c;是非常优秀的性能测试和接口测试工具&#xff0c;支持主流协议的测试 2.jmeter能做什么&#xff1f; JMeter是100%完全由Java语言编写的软件性能测试的GUI的测试工具&am…

基于协同过滤的电影评论数据分析与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目介绍 随着社会的发展&#xff0c;人们生活水平的提高&#xff0c;欣赏电影逐渐成为人们闲暇时的主要娱乐方式之一。本文电影推荐系统是为了给顾客提供方便快捷的热门电影推荐以及查询电影资讯而建立的&…

供应链 | 顶刊MSOM论文精选——关税对全球供应链网络配置的影响:模型、预测和未来研究

编者按 关税对企业全球供应链网络设计决策的影响 本文为 M&SOM期刊20周年特邀论文&#xff0c;原文信息&#xff1a; Lingxiu Dong, Panos Kouvelis (2020) Impact of Tariffs on Global Supply Chain Network Configuration: Models, Predictions, and Future Research…

模式识别与机器学习(八):决策树

1.原理 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树状模…

SkinEngine皮肤怎么给项目的所有窗体

C# 给winfrom窗体添加皮肤控件SkinEngine怎么给整个项目换皮怎么给winform的按钮添加统一样式怎么使用样式表给winform所有按钮添加统一样式SkinEngine皮肤怎么给项目的所有窗体 如何快速给C# winform添加好看的皮肤C# Winform中窗体的美化 SkinEngine的应用 皮肤控件换肤素材…

【SpringCloud笔记】(8)服务网关之GateWay

GateWay 概述简介 官网地址&#xff1a; 上一代网关Zuul 1.x&#xff1a;https://github.com/Netflix/zuul/wiki&#xff08;有兴趣可以了解一下&#xff09; gateway&#xff1a;https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/…

linux运维的面试题一

1.linux启动过程 1加电 2加载主板bios设置 3加载多重操作系统启动管理器grub 4加载内核系统到内存当中 5加载配置文件 6加载内核模块 7完成相应的初始化工作和启动相应的服务 8启动系统进程 9出现登录界面 10开机启动完成 2.安装过操作系统吗&#xff1f;怎么安装? 1.小批量设…

嵌入式硬件电路原理图之跟随电路

描述 电压跟随电路 电压跟随器是共集电极电路&#xff0c;信号从基极输入&#xff0c;射极输出&#xff0c;故又称射极输出器。基极电压与集电极电压相位相同&#xff0c;即输入电压与输出电压同相。这一电路的主要特点是&#xff1a;高输入电阻、低输出电阻、电压增益近似为…

线段树/区间树(java实现版详解附leetcode例题)

目录 什么是线段树 线段树基础表示 创建线段树&#xff08;Java版详解&#xff09; 线段树的区间查询 leetcode上的线段树相关问题 leetcode303题.区域和检索-数组不可变 使用线段树解题 不使用线段树解题 leetcode307题.区域和检索-数组可修改 不使用线段树解题 线…

Python----静态Web服务器-返回指定页面数据

1. 静态Web服务器的问题 目前的Web服务器&#xff0c;不管用户访问什么页面&#xff0c;返回的都是固定页面的数据&#xff0c;接下来需要根据用户的请求返回指定页面的数据 返回指定页面数据的实现步骤: 获取用户请求资源的路径根据请求资源的路径&#xff0c;读取指定文件…

VUE element组件生成的全选框如何获取值

//先声明 const Selection ref([]);//获取 const handleSelectCodeForTicket (val) > {console.log(val);// values.value val;Selection.value [];val.forEach((v) > {Selection.value.push(v);});console.log(Selection.value); }; <el-table selection-change…

docker-compaose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

毅速:3D打印随形水路已经逐步向压铸模具普及

随着科技的不断发展&#xff0c;3D打印技术已经逐渐渗透到各个领域。其中&#xff0c;3D打印随形水路在注塑模具中已经广泛应用&#xff0c;目前正逐渐向压铸模具普及。 传统CNC等减材工艺的水路制造&#xff0c;可以在模具中生产出平直的冷却水路&#xff0c;但这种工艺难以加…

FMQL开发环境搭建

FMQL开发环境搭建 一、概述 此篇记录上海复旦微电子JFMQL15T开发板开发环境搭建&#xff0c;包含procise安装、vivado2018.3安装破解、IAR安装&#xff0c;以及vivado2018.3 IP_PATCH打补丁全过程&#xff0c;为后续开发基础。 二、IAR安装 安装IAR的软件版本是IAR 8.32.1,…