Iceberg从入门到精通系列之十九:分区

Iceberg从入门到精通系列之十九:分区

  • 一、认识分区
  • 二、Iceberg的分区
  • 三、Hive 中的分区
  • 四、Hive 分区问题
  • 五、Iceberg的隐藏分区
  • 六、分区变换
  • 七、分区变换

一、认识分区

分区是一种通过在写入时将相似的行分组在一起来加快查询速度的方法。

例如,从日志表中查询日志条目通常会包含一个时间范围,就像针对上午 10 点到 12 点之间的日志的查询一样:

SELECT level, message FROM logs
WHERE event_time BETWEEN '2018-12-01 10:00:00' AND '2018-12-01 12:00:00'

将日志表配置为按 event_time 日期分区会将日志事件分组到具有相同事件日期的文件中。 Iceberg 会跟踪该日期,并使用它来跳过没有有用数据的其他日期的文件。

Iceberg 可以按年、月、日和小时粒度对时间戳进行分区。它还可以使用分类列(如本日志示例中的级别)将行存储在一起并加快查询速度。

二、Iceberg的分区

其他表格式(如 Hive)支持分区,但 Iceberg 支持隐藏分区。

  • Iceberg 处理为表中的行生成分区值这一繁琐且容易出错的任务。
  • Iceberg 避免自动读取不必要的分区。消费者不需要知道表是如何分区的,也不需要在查询中添加额外的过滤器。
  • Iceberg分区布局可以根据需要演变。

三、Hive 中的分区

为了演示差异,请考虑 Hive 如何处理日志表。

在 Hive 中,分区是显式的并显示为一列,因此日志表将有一个名为 event_date 的列。写入时,插入需要为 event_date 列提供数据:

INSERT INTO logs PARTITION (event_date)SELECT level, message, event_time, format_time(event_time, 'YYYY-MM-dd')FROM unstructured_log_source

同样,搜索日志表的查询除了 event_time 过滤器之外还必须具有 event_date 过滤器。

SELECT level, count(1) as count FROM logs
WHERE event_time BETWEEN '2018-12-01 10:00:00' AND '2018-12-01 12:00:00'AND event_date = '2018-12-01'

如果 event_date 过滤器丢失,Hive 将扫描表中的每个文件,因为它不知道 event_time 列与 event_date 列相关。

四、Hive 分区问题

必须为 Hive 指定分区值。在日志示例中,它不知道 event_time 和 event_date 之间的关系。

这会导致几个问题:

  • Hive 无法验证分区值 - 由编写者来生成正确的值
    • 使用错误的格式(2018-12-01 而不是 20181201)会默默产生错误结果,而不是查询失败
    • 使用错误的源列(例如处理时间或时区)也会导致错误的结果,而不是失败
  • 由用户决定是否正确编写查询
    • 使用错误的格式也会导致无提示的错误结果
    • 不了解表的物理布局的用户会获得不必要的缓慢查询 – Hive 无法自动翻译过滤器
  • 工作查询与表的分区方案相关联,因此在不破坏查询的情况下无法更改分区配置

五、Iceberg的隐藏分区

Iceberg 通过获取列值并选择性地对其进行转换来生成分区值。 Iceberg 负责将 event_time 转换为 event_date,并跟踪这种关系。

表分区是使用这些关系配置的。日志表将按日期(事件时间)和级别进行分区。

因为 Iceberg 不需要用户维护分区列,所以它可以隐藏分区。每次都会正确生成分区值,并且在可能的情况下始终用于加快查询速度。生产者和消费者甚至看不到 event_date。

最重要的是,查询不再依赖于表的物理布局。通过物理和逻辑的分离,Iceberg 表可以随着数据量的变化而不断演变分区方案。错误配置的表无需进行昂贵的迁移即可修复。

六、分区变换

数据文件存储在带有分区值元组的清单中,这些分区值在扫描中用于过滤掉不能包含与扫描过滤谓词匹配的记录的文件。对于数据文件中存储的所有记录,数据文件的分区值必须相同。 (清单存储来自任何分区的数据文件,只要数据文件的分区规范相同。)

表配置有分区规范,该规范定义如何从记录生成分区值元组。分区规范有一个字段列表,其中包括:

  • 表架构中的源列 ID
  • 分区字段id,用于标识分区字段,在分区规范中是唯一的。在 v2 表元数据中,它在所有分区规范中都是唯一的。
  • 应用于源列以生成分区值的转换
  • 分区名称

由 id 选择的源列必须是原始类型,并且不能包含在映射或列表中,但可以嵌套在结构中。

分区规范捕获从表数据到分区值的转换。除了转换数据值之外,这还用于将谓词转换为分区谓词。从表数据上的列谓词派生分区谓词用于将逻辑查询与物理存储分开:分区可以更改,并且始终从列谓词派生出正确的分区过滤器。这简化了查询,因为用户不必同时提供逻辑谓词和分区谓词。

分区变换

变换名称描述源类型结果类型
identity源值,未修改Any源类型
bucket[N]哈希值,mod N(见下文)int, long, decimal, date, time, timestamp, timestamptz, string, uuid, fixed, binaryint
truncate[W]值被截断为宽度 W(见下文)int, long, decimal, string源类型
year提取日期或时间戳年份,即从 1970 年开始的年份date, timestamp, timestamptzint
month提取日期或时间戳月份,如 1970-01-01 以来的月份date, timestamp, timestamptzint
day提取日期或时间戳日,如 1970-01-01 以来的天数date, timestamp, timestamptzint
hour提取时间戳小时,即从 1970-01-01 00:00:00 开始的小时数timestamp, timestamptzint
void总是产生 nullAny源类型或 int

对于 null 输入值,所有转换都必须返回 null。

void 变换可用于替换现有分区字段中的变换,以便该字段在 v1 表中有效删除。

七、分区变换

Iceberg 表分区可以在现有表中更新,因为查询不直接引用分区值。

当您改进分区规范时,使用早期规范写入的旧数据保持不变。新数据是在新布局中使用新规范写入的。每个分区版本的元数据单独保存。因此,当您开始编写查询时,您会得到分割计划。这是每个分区布局使用为该特定分区布局派生的过滤器单独规划文件的地方。这是一个人为示例的直观表示:

在这里插入图片描述
2008 年的数据按月划分。从 2009 年开始,该表进行了更新,数据改为按天分区。两种分区布局都可以在同一个表中共存。

Iceberg 使用隐藏分区,因此您无需为特定分区布局编写查询即可快速运行。相反,您可以编写查询来选择所需的数据,Iceberg 会自动删除不包含匹配数据的文件。

分区演化是元数据操作,不会急切地重写文件。

Iceberg 的 Java 表 API 提供了 updateSpec API 来更新分区规范。例如,以下代码可用于更新分区规范,以添加一个新的分区字段,将 id 列值放入 8 个存储桶中,并删除现有的分区字段类别:

Table sampleTable = ...;
sampleTable.updateSpec().addField(bucket("id", 8)).removeField("category").commit();

Spark 支持通过其 ALTER TABLE SQL 语句更新分区规范。

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

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

相关文章

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

IPv6路由协议---IPv6动态路由(OSPFv3-3)

OSPFv3使用Link-local地址 OSPFv3是运行在IPv6上的路由协议,同样使用链路本地地址来维持邻居,同步LSA数据库。除Vlink外的所有OSPFv3接口都使用链路本地地址作为源地址及下一跳来发送OSPFv3报文,带来的好处: 不需要配置IPv6全局地址,就可以得到OSPFv3拓扑,实现拓扑与地址…

【职工管理系统(C++版)】

一、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息。 本次主要利用C来实现一个基于多态的职工管理系统。 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责。 普通员工职责:完成经…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤(黑马springCloud的p29&#xff0…

springboot邮件发送

一、讲一下thymeleaf的简单使用 1.在根路径下写一个 resources/templates/good.html 文件 2. 在代码实现 记得 不要加 RequestBody这个注解,因为它会把string当作普通 的字符串,而不是去渲染对应的good.html视图 3.看效果 关于图片的显示&#xff0…

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频: 同学们,在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的同学以外,大多数同学都会有相同的…

【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 C算法:滑动窗口总结 动态规划 LeetCode3003 执行操作后的最大分割数量 给你一个下标从 0 开始的字符串 s 和一个整数 k。 你需要执行以下分割操作,直到字符串 s 变为 空&#xff1…

四大会计假设

目录 一. 会计主体假设二. 持续经营假设三. 会计期间假设四. 货币计量假设 \quad \quad 一. 会计主体假设 \quad 会计主体: 会计工作为其服务的特定单位或组织。 会计主体的定义 1.具有一定数量的资金。 2.进行独立的生产经营或其他活动。 3.实行独立核算。 \quad 会计主体假设…

leetcode 125. 验证回文串

题目: 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是 回文串 ,返回 true &…

阅读文献-胃癌

写在前面 今天先不阅读肺癌的了,先读一篇胃癌的文章 文献 An individualized stemness-related signature to predict prognosis and immunotherapy responses for gastric cancer using single-cell and bulk tissue transcriptomes IF:4.0 中科院分区:2区 医学…

JFinal综合信息管理系统

项目地址:mendianyu/AdvancedManagement: 综合信息管理系统 (github.com) 项目演示地址:软件构造大作业演示视频_哔哩哔哩_bilibili 项目功能 一:基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理&…

初识Spring

1.Spring官网: 2.官网学习的顺序:先学Spring,再学SpringBoot,然后SpringCloud,Spring Cloud Data Flow。 3.Spring Framework界面: 4.github上的源代码: 5.进入使用说明文档: 主要是根据这个进行学习的。 6.我们用mave…

Linux Debian12使用VSCode和Python搭建flask开发环境

一、安装VSCode 在Linux Debian12系统上安装VSCode教程可以参考网上相关教程。 二、安装Python 打开VSCode,安装python和python扩展包,如下图所示: 三、创建Python虚拟环境 1.新建文件夹testFlask 2.用vscode打开文件夹testFlask&#xf…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类,那么A类叫做子类,B类叫成基类 子类 ---》派生类 基类 ---》超类(父类) // 继承之间的叫法 // A类继承了B类,那么A类叫做子类,B类叫成基类 // 子类 ---》派生类 // 基类 …

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子(闯关游戏) sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

计算机体系结构----缓存一致性/多处理机

本文严禁转载,仅供学习使用。参考资料来自中国科学院大学计算机体系结构课程PPT以及《Digital Design and Computer Architecture》、《超标量处理器设计》、同济大学张晨曦教授资料。如有侵权,联系本人修改。 本文衔接上文计算机体系结构----存储系统 …

python爬虫,验证码识别,携带cookies请求

古诗词网案例!!! 识别验证码类型: # 此处用到的图片验证码识别网址为:http://ttshitu.com/ 图鉴 import base64 import json import requests # 一、图片文字类型(默认 3 数英混合): # 1 : 纯数字 # 1001:纯数字2 # 2 : 纯英文 # 1002:纯英文2 # 3 : 数英混合 # 1003:…

用通俗易懂的方式讲解:大模型微调方法总结

大家好,今天给大家分享大模型微调方法:LoRA,Adapter,Prefix-tuning,P-tuning,Prompt-tuning。 文末有大模型一系列文章及技术交流方式,传统美德不要忘了,喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

轻松查看WiFi密码的神奇脚本,让你忘记密码也不再是问题

说在前面 🎈本文介绍了一个便捷的脚本,可以帮助你获取电脑中保存的所有Wi-Fi网络的密码。不再需要担心忘记Wi-Fi密码或手动查找密码的麻烦,只需运行脚本即可一键获取。 一、引言 互联网的普及让我们离不开Wi-Fi网络,但忘记密码时…

怎么安装es、kibana(单点安装)

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大&#xff0c…