BigQuery 分区表简介和使用

大纲

在这里插入图片描述

什么是分区表

我们先看定义:

分区表是一种数据库表设计和管理技术,它将表中的数据划分为逻辑上的多个分区,每个分区包含一组特定的数据。每个分区都根据定义的分区键(通常是一个列或字段)的值进行分类,使得数据可以按照特定的逻辑规则进行划分和组织。

通过使用分区表,可以将大型表分解为更小的、可管理的部分,以提高查询性能、数据维护效率和存储资源的利用率。分区表的实现方式和语法可能因数据库管理系统而异,但基本概念和原则是相似的。





具体给个例子:

我有张table sales_details, 和一些测试数据, 如下:

select * from DS2.sales_details

Order_ID|Product                 |Quantity_Ordered|Price_Each|Order_Date|Purchase_Address                        |
--------+------------------------+----------------+----------+----------+----------------------------------------+
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176565  |updated                 |               1|    1700.0|2019-04-24|915 Willow St, San Francisco, CA 94016  |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176609  |Apple Airpods Headphones|               1|     150.0|2019-04-11|267 11th St, Austin, TX 73301           |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176617  |Apple Airpods Headphones|               1|     150.0|2019-04-25|319 8th St, Portland, OR 97035          |
176591  |Apple Airpods Headphones|               1|     150.0|2019-04-21|600 Maple St, Austin, TX 73301          |
176591  |Apple Airpods Headphones|               1|     150.0|2019-04-21|600 Maple St, Austin, TX 73301          |
176591  |Apple Airpods Headphones|               1|     150.0|2019-04-21|600 Maple St, Austin, TX 73301          |
176591  |Apple Airpods Headphones|               1|     150.0|2019-04-21|600 Maple St, Austin, TX 73301          |

当这个表的数据量增大时, 去查询这个表的性能会变慢。

这时我们定下1个规则, 我们查询这个表时都必须加上1个filter 字段。 这个字段设成是Order_Date (字段类型是DATE)
我们查询时都加上这个filter 查询某1天or 某段时间内的数据, 例如

select * from DS2.sales_details where Order_Date = '2019-04-11'

如果用户场景符合上面的前提, 那么我们就可以为这个表做成分区表了

在这里插入图片描述
如上图, 我们可以利用Order_Date 做分区, 把整个table 以每一日创建1个分区。

那么当我们执行上面的sql

select * from DS2.sales_details where Order_Date = '2019-04-11'

那么它就会只在 2019-04-11的表分区里面查询, 避免了全表检索, 查询速度就大大加快了。

好了, 上面只是一些基本原理, 下面是一些常见问题。




1. 如果查询条件是1个区间, 例如 Order_Date >= ‘2019-04-11’, 分区表还有效吗?

有效, 这种情况下排除了 2019-04-11 之前的分区, 还是避免了全表检索, 这个查询会查询2019-04-11 之前的所有分区, 所以建议filter 加上下界
例如

select * from DS2.sales_details_p4 where Order_Date BETWEEN  '2019-04-24' and '2019-04-29'

这样这个sql只会 在某几个表分区查询, 而Big Query是支持并发在多个表分区里查询数据的。




2. 以每一日做1个分区, 会导致表分区过多?

BigQuery 用时间分区表的话, 还支持用 hour, month , year来分区!




3. 如果查询分区表不加上分区字段filter, 查询效率会更差?

没错, 如果上面的例子, sql里不加上Order_date filter 的话, sql会在所有的分区里查询数据, 效率会比非分区表更差! 所以创建分区表时要考虑清楚表的查询场景!




4. 如果查询sql 一定要加上分区字段filter, 为何不直接加个索引? 一样能大大加快查询速度。

的确, 为filter 字段加上索引更加省事也更常用。 这是1个好问题。

为了回答这个问题, 要列出下面几点

a. BigQuery 不是普通关系数据库, 它不支持索引, BQ 本身是通过分区和分桶, 然后在背后实现并发查询来提高速度的。
下面的point是对于其他数据库的

b. 对于传统关系数据库, 例如Oracle Mysql, 表大小在1GB以下的还是建议索引更高效, 表越大, 分区表优势越大!
c. 如果查询结果集范围相对较小, 使用索引会更合适
d. 查询结果集的范围涉及多个分区, 使用多个分区表更高效
e. 复杂查询下, 即使使用索引, 也会涉及很多子查询, 子查询的数据可能会占用临时表空间甚至内存。 使用分区表只会在某些物理介质里查询, 更高效
f.数据管理和维护:分区表可以更好地管理数据,使数据维护操作更高效。你可以针对特定的分区执行数据导入、删除或重组操作,而无需处理整个表。这对于大型数据集或频繁进行数据维护的情况下尤为重要。
g.存储和成本控制:分区表允许你根据数据的生命周期和访问模式应用不同的存储策略和成本控制措施。例如,你可以选择将较旧的分区存储在低成本的存储介质上,而将最近的分区存储在高性能的存储介质上。这可以帮助降低存储成本,同时保持查询性能。

但是对于BQ, 核心技术是多分区并发查询!




BigQuery 分区表类型

根据本码农分析, BQ 的分区表大概分3种类型

1.时间分区表 (time_partitioning)

这个种分区表必须指定1个时间类型的字段。 也就是这个字段的类型为必须是 DATE 和 Timestamp的一种

其中DATE 类型只包含日期, 没有时分秒信息
而TIMESTAMP包含时分秒甚至毫秒

而且分区的类型要选择下面的4种之一
Hour, Day, Month, Year

本文只会用时间分区表作为详细例子, 其他两种会简单带过




2. 区间分区表 (integer-range_partitioning)

区间分区表必须以1个 Integer类型字段作为分区字段。 (例如 id值)

而且还需要设定1个属性 range, 也就多大的值范围作1个分区

例如, 我有1个张很多学生的考试分数表
可以对分数(前提是整数) 作为分区字段

range 可以set称10
那么这个分数表就大概分成 10 个分区了。




3. 注入时间分区表 (ingestion-time_partitioning)

这种比较特别, 其实也是时间分区表的一种, 但是不必制定分区字段。
这种分区表会用 当前record 被插入到表的时间戳作为分区字段。

一旦这种分区表被创建, 就有1个伪列 _PARTITIONTIME or _PARTITIONDATE
可以获得当前record的首次插入表的时间
同样
也需要制定type
Hour, Day, Month, Year 的一种




创建 BigQuery 分区表

有多种 方法, 包括 bq 命令, sql, google api等
这里只介绍terraform

resource "google_bigquery_table" "sales_details_p" {
  dataset_id = google_bigquery_dataset.dataset1.dataset_id
  table_id   = "sales_details_p"
  project    = var.project_id
  deletion_protection = false
  schema = <<EOF
[
    {
        "name": "Order_ID",
        "type": "STRING"
    },
    {
        "name": "Product",
        "type": "STRING"
    },
    {
        "name": "Quantity_Ordered",
        "type": "INTEGER"
    },
    {
        "name": "Price_Each",
        "type": "FLOAT"
    },
    {
        "name": "Order_Date",
        "type": "DATE"
    },
    {
        "name": "Purchase_Address",
        "type": "STRING"
    }
]
EOF

 time_partitioning {
    type                     = "DAY"  # partitioning by Day
    field                    = "Order_Date"  # Use it as the partition field
    //expiration_ms            = 2592000000  # set the expired days to 30
    //require_partition_filter = true  # must use partition filter
  }
}

上面的terraform 就定义了1个分区表资源 sales_details_p, 它以Order_Date 作为分区字段
值得注意的是

  1. 分区字段, 例如上面的Order_date, 类型不能为String, 根据实际选择DATE OR TIMESTAMP
  2. expiration_ms 表示当前分区表的分区的过期日期(毫秒表示), 可以不设置, 后面会详解
  3. require_partition_filter 表示是否强制要求对这个分区表的查询加上分区表字段filter, 后面会详解

当表被创建后,可以用bq show 来查看该表的分区信息

[gateman@manjaro-x13 coding]$ bq show DS2.sales_details_p
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13
  import pipes
Table jason-hsbc:DS2.sales_details_p

   Last modified               Schema              Total Rows   Total Bytes   Expiration      Time Partitioning      Clustered Fields   Total Logical Bytes   Total Physical Bytes   Labels  
 ----------------- ------------------------------ ------------ ------------- ------------ ------------------------- ------------------ --------------------- ---------------------- -------- 
  23 Dec 04:18:36   |- Order_ID: string            0            0                          DAY (field: Order_Date)                      0                                                    
                    |- Product: string                                                                                                                                                       
                    |- Quantity_Ordered: integer                                                                                                                                             
                    |- Price_Each: float                                                                                                                                                     
                    |- Order_Date: date                                                                                                                                                      
                    |- Purchase_Address: string                                                                                                                                              

[gateman@manjaro-x13 coding]$ 




查询 BigQuery 分区表

当分区表sales_details_p 创建好后, 我们把数据从 非分区表 sales_details 插入到 sales_details_p

INSERT INTO DS2.sales_details_p
(Order_ID, Product, Quantity_Ordered, Price_Each, Order_Date, Purchase_Address)
select Order_ID, Product, Quantity_Ordered, Price_Each,  PARSE_DATE('%Y-%m-%d', Order_Date) AS Order_Date, Purchase_Address 
from DS2.sales_details




查询时间分区表

很简单上面已经举过例子了, 只需要加上分区key的filter

select * from DS2.sales_details_p where Order_Date BETWEEN  '2019-04-24' and '2019-04-29'




查询区间分区表

一样, 例如
假设分区表 product 的分区字段是product_id (Interger)

select * from DS2.product  where product_id BETWEEN  1000 and 2000




查询注入时间分区表

假设分区表product 是注入时间分区表
则我们需要用伪列来作filter

select * from DS2.product  where _PARTITIONTIME BETWEEN  TIMESTAMP('2016-01-01') AND TIMESTAMP('2016-01-02')




管理BigQuery 分区表

获取分区表元数据

就是查看当前的分区表共有多少个表分区等信息
我们可以看查询 《Dataset》.INFORMATION_SCHEMA.PARTITIONS 这个系统表

SELECT table_name, partition_id, total_rows,*
FROM `DS2.INFORMATION_SCHEMA.PARTITIONS`
WHERE table_name = 'sales_details_p'


table_name     |partition_id|total_rows|table_catalog|table_schema|table_name_1   |partition_id_1|total_rows_1|total_logical_bytes|total_billable_bytes|last_modified_time     |storage_tier|
---------------+------------+----------+-------------+------------+---------------+--------------+------------+-------------------+--------------------+-----------------------+------------+
sales_details_p|20190401    |         6|jason-hsbc   |DS2         |sales_details_p|20190401      |           6|                546|                 546|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190411    |        30|jason-hsbc   |DS2         |sales_details_p|20190411      |          30|               2676|                2676|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190421    |        18|jason-hsbc   |DS2         |sales_details_p|20190421      |          18|               1590|                1590|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190417    |        12|jason-hsbc   |DS2         |sales_details_p|20190417      |          12|               1068|                1068|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190419    |        12|jason-hsbc   |DS2         |sales_details_p|20190419      |          12|               1110|                1110|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190430    |        30|jason-hsbc   |DS2         |sales_details_p|20190430      |          30|               2718|                2718|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190407    |        24|jason-hsbc   |DS2         |sales_details_p|20190407      |          24|               2286|                2286|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190429    |        12|jason-hsbc   |DS2         |sales_details_p|20190429      |          12|               1074|                1074|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190415    |        18|jason-hsbc   |DS2         |sales_details_p|20190415      |          18|               1626|                1626|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190403    |        12|jason-hsbc   |DS2         |sales_details_p|20190403      |          12|               1020|                1020|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190425    |         6|jason-hsbc   |DS2         |sales_details_p|20190425      |           6|                540|                 540|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190405    |        12|jason-hsbc   |DS2         |sales_details_p|20190405      |          12|               1140|                1140|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190427    |        30|jason-hsbc   |DS2         |sales_details_p|20190427      |          30|               2790|                2790|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190412    |        18|jason-hsbc   |DS2         |sales_details_p|20190412      |          18|               1554|                1554|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190424    |        12|jason-hsbc   |DS2         |sales_details_p|20190424      |          12|               1008|                1008|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190402    |        30|jason-hsbc   |DS2         |sales_details_p|20190402      |          30|               2646|                2646|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190409    |        12|jason-hsbc   |DS2         |sales_details_p|20190409      |          12|                984|                 984|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190420    |         6|jason-hsbc   |DS2         |sales_details_p|20190420      |           6|                552|                 552|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190422    |         6|jason-hsbc   |DS2         |sales_details_p|20190422      |           6|                516|                 516|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190410    |        12|jason-hsbc   |DS2         |sales_details_p|20190410      |          12|               1092|                1092|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190428    |         6|jason-hsbc   |DS2         |sales_details_p|20190428      |           6|                570|                 570|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190408    |         6|jason-hsbc   |DS2         |sales_details_p|20190408      |           6|                474|                 474|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190418    |        18|jason-hsbc   |DS2         |sales_details_p|20190418      |          18|               1590|                1590|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190404    |        24|jason-hsbc   |DS2         |sales_details_p|20190404      |          24|               2250|                2250|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190426    |        12|jason-hsbc   |DS2         |sales_details_p|20190426      |          12|               1074|                1074|2023-12-23 04:23:42.439|ACTIVE      |
sales_details_p|20190416    |        12|jason-hsbc   |DS2         |sales_details_p|20190416      |          12|               1026|                1026|2023-12-23 04:23:42.439|ACTIVE      |

可以见到, 分区id (partition_id)就是日期




强制使用分区字段filter

就是上面提到的分区表属性 require_partition_filter
个人建议谨慎设置

设置为true的优点是, 强制所有其他开发人员写sql时加上分区字段filter, 否则会报错

SQL Error [100032] [HY000]: [Simba][BigQueryJDBCDriver](100032) Error executing query job. 
Message: Cannot query over table 'DS2.sales_details_p2' without a filter over column(s) 'Order_Date' that can be used for partition elimination

缺点是, 所有包括count等所有就和函数也需要加上filter, 否则失败, 而且无法在GCP console上预览数据, 有时难以用sql获得表的总体信息.




设置失效时间

就是expiration_ms , 用毫秒表示

注意失效时间是以分区字段的值开始计算

例如expiration_ms 设成30日的话,

当我在20231221 插入一条Order_Date 为20190622 的数据时, 你以为用 Order_date =‘20190622’ 能查到数据?

其实是 分区20190622 一旦创建就马上过期(从20190622 算起。。) 今天已经是2023年了

所以这种情况下会导致分区创建后被删除, 数据会丢失
即使使用 select * from table 不加上分区字段filter (没有设成require_partition_filter=true的话) 也是查不出该数据的…

所以谨慎设置, 个人建议不要设置这个属性, 默认是分区永不过期




删除某个表分区

如果向手动删除一些旧数据, 而想直接删除某个分区的话

总之这个操作很危险, 对应的sql也没找到

我们可以用bq 民令来实现
bq rm --table project_id:dataset.table$partition

例如:

[gateman@manjaro-x13 coding]$ bq rm --table 'DS2.sales_details_p$20190407'
/home/gateman/devtools/google-cloud-sdk/platform/bq/bq.py:17: DeprecationWarning: 'pipes' is deprecated and slated for removal in Python 3.13
  import pipes
rm: remove table 'jason-hsbc:DS2.sales_details_p$20190407'? (y/N) y
[gateman@manjaro-x13 coding]$ 

注意这个操作也是删除数据的操作!没事别删, BQ存储很便宜!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

构建创新学习体验:企业培训系统技术深度解析

企业培训系统在现代企业中发挥着越来越重要的作用&#xff0c;它不仅仅是传统培训的延伸&#xff0c;更是技术创新的结晶。本文将深入探讨企业培训系统的关键技术特点&#xff0c;并通过一些简单的代码示例&#xff0c;展示如何在实际项目中应用这些技术。 1. 前端技术&#…

SLAM算法与工程实践——雷达篇:Livox激光雷达使用

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

微信小程序格创校园跑腿小程序源码v1.1.64+前端

简介&#xff1a; 版本号&#xff1a;1.1.64 – 多学校版本 本次更新内容&#xff1a; 订单问题修复 &#xff08;无需上传小程序&#xff09; 版本号&#xff1a;1.1.63 – 多学校版本 本次更新内容&#xff1a; 失物招领增加内容安全接口&#xff1b; 认证增加性别选…

freeswitch on debian docker

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 因为centos系统期限的原因&#xff0c;尝试在debian的docker上使用fs。 环境 docker engine&#xff1a;Version 24.0.6 debian docker&#xff1a;bullseye 11.8 freeswitch&#xff1a;v1.10.7 Debian准备 目前…

有待写入光盘的文件处理办法

windows11系统中 dvd盘中拖入文件后&#xff0c;文件未写入&#xff0c;信息提示有待写入光盘的文件 处理办法&#xff1a; 同时按住shift鼠标右键&#xff0c;点击光盘图标&#xff1a; 选择刻录到光盘 点击下一步 选择重新刻录 反复几次发现无法完成。 最后处理办法&…

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据&#xff0c;但还需要给用户去创建账号允许他们登录后才能看展示得数据&#xff0c;那有什么办法让非管理员更方便得去访问Grafana呢&#xff1f;下面介绍两个比较方便实现的&#xff1a; 在开始设置前&#xff…

FastAPI实现文件上传下载

FastAPI实现文件上传下载 1.后端FastAPI2.后端html3.效果 最近的项目需求&#xff0c;是前端vue&#xff0c;后端fastAPI&#xff0c;然后涉及到图像的消息发送&#xff0c;所以需要用fast写文件上传下载的接口&#xff0c;这里简单记录一下。 1.后端FastAPI import os.path i…

C++的面向对象学习(5):对象的重要特性:对象的成员变量和成员函数深入研究

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、static修饰的静态成员&#xff1a;与类本身关联&#xff0c;不依赖于任何对象。①静态成员变量&#xff1a;②静态成员函数&#xff1a;&#xff08;1&#xff…

Docker 编译OpenHarmony 4.0 release

一、背景介绍 1.1、环境配置 编译环境&#xff1a;Ubuntu 20.04OpenHarmony版本&#xff1a;4.0 release平台设备&#xff1a;RK3568 OpenHarmony 3.2更新至OpenHarmony 4.0后&#xff0c;公司服务器无法编译通过&#xff0c;总是在最后几十个文件时报错,错误码4000&#xf…

python+django教学质量评价系统o8x1z

本基于web的在线教学质量评价系统的设计与实现有管理员&#xff0c;教师&#xff0c;督导&#xff0c;学生一共四个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;督导管理&#xff0c;学生评价管理&#xff0c;课程信息管理&#xff0c;学生…

less 查看文本时,提示may be a binary file.See it anyway?

解决办法 首先使用echo $LESSCHARSET查看less的编码 看情况设置less的编码格式(我的服务器上使用utf-8查看中文) 还要特别注意一下&#xff0c;Linux中存在的文本文件的编码一定要是utf - 8;&#xff08;这一步很关键&#xff09; 例如&#xff1a;要保证windows上传到Linux的…

Centos系统升级gcc版本

自己环境的gcc版本太低&#xff0c;影响使用SAN全家桶进行内存泄露检查 当前环境gcc版本查看 gcc --version 进行升级&#xff1a; 1、安装EPEL存储库 yum install epel-release -y 2、确保系统已经更新到最新版本 yum update -y 3、安装GCC编译器及其相关工具包 yum g…

The Cherno C++笔记 03

目录 Part 07 How the C Linker Works 1.链接 2.编译链接过程中出现的错误 2.1 缺少入口函数 注意:如何区分编译错误还是链接错误 注意&#xff1a;入口点可以自己设置 2.2 找不到自定义函数 2.2.1缺少声明 2.2.2自定义函数与引用函数不一致 2.3 在头文件中放入定义 …

基于kubernetes实现PaaS云平台-rancher

基于Rancher实现kubernetes集群管理 一、Rancher介绍 1.1 Rancher Rancher 是一套容器管理平台&#xff0c;它可以帮助组织在生产环境中轻松快捷的部署和管理容器。Rancher可以轻松地管理各种环境的 Kubernetes&#xff0c;满足IT需求并为 DevOps 团队提供支持。 Rancher 用…

css 设备背景图片 宽高总是不能平铺

宽高总是宽大了 高就挤出去了&#xff1b;高设置了 宽度就变小了&#xff1b;疯掉的节奏。。。。。。 .center-bottom{background: url(/img/newpic/leftbg.png);background-repeat: no-repeat;width: 98%;height: 60%;background-position: center center;background-size: 1…

STM32微控制器在HC-SR501红外感应模块中的能耗优化策略研究

一、 引言 能耗优化是嵌入式系统设计中一个重要的考虑因素&#xff0c;特别是在电池供电的应用中。在使用HC-SR501红外感应模块时&#xff0c;能耗优化策略对于延长电池寿命、提高系统性能至关重要。本文将阐述基于STM32微控制器的HC-SR501红外感应模块能耗优化策略研究。 二、…

Apache Flink 进阶教程(六):Flink 作业执行深度解析

目录 前言 Flink 四层转化流程 Program 到 StreamGraph 的转化 StreamGraph 到 JobGraph 的转化 为什么要为每个 operator 生成 hash 值&#xff1f; 每个 operator 是怎样生成 hash 值的&#xff1f; JobGraph 到 ExexcutionGraph 以及物理执行计划 Flink Job 执行流程…

web架构师编辑器内容-改进字体下拉菜单

前面说到我们可以通过面板配置来更新画布上面的一些属性&#xff0c;如果我们有这样一个需求&#xff1a;在右侧面板配置里面需要查看字体的样式效果我们应该怎么做呢&#xff1f; 我们一开始字体的渲染&#xff1a; const fontFamilyArr [{value: "SimSun","…

parseInt(0.0000005)大于等于5

文章目录 一、前言二、parseInt()的神秘行为三、解决parseInt()的奥秘四、结论五、最后 一、前言 parseInt() 是 JavaScript 的内置函数&#xff0c;用于解析数字字符串中的整数。例如&#xff0c;从数字字符串中解析整数100&#xff1a; const number parseInt(100); numbe…

nodejs+vue+微信小程序+python+PHP医疗机构药品及耗材信息管理系统-计算机毕业设计推荐

为了帮助用户更好的了解和理解程序的开发流程与相关内容&#xff0c;本文将通过六个章节进行内容阐述。 第一章&#xff1a;描述了程序的开发背景&#xff0c;程序运用于现实生活的目的与意义&#xff0c;以及程序文档的结构安排信息&#xff1b; 第二章&#xff1a;描述了程序…