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

news2024/9/28 3:22:46

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.coloradmin.cn/o/1363933.html

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

相关文章

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是:简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显,一般使用递归方式实现,但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

【WPF】使用 WriteableBitmap 提升 Image 性能

【WPF】使用 WriteableBitmap 提升 Image 性能 前言WriteableBitmap 背景WriteableBitmap 渲染原理WriteableBitmap 使用技巧案例核心源码测试结果 前言 由于中所周不知的原因,WPF 中想要快速的更新图像的显示速率一直以来都是一大难题。在本文中,我将分…

leetcode“位运算”——只出现一次的数字

只出现一次的数字i&#xff1a; https://leetcode.cn/problems/single-number/ 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<i…

九州金榜|孩子厌学,作为父母有想做自己的原因吗?

孩子不会天生就厌学&#xff0c;如果孩子天生厌学&#xff0c;那么孩子就不可能学会说话&#xff0c;走路&#xff0c;日常生活&#xff0c;更不可能去上学&#xff0c;孩子厌学因素非常多&#xff0c;而作为父母&#xff0c;你有没有想过是你的原因造成的呢&#xff1f;九州金…

【深度学习:Domain Adversarial Neural Networks (DANN) 】领域对抗神经网络简介

【深度学习&#xff1a;Domain Adversarial Neural Networks】领域对抗神经网络简介 前言领域对抗神经网络DANN 模型架构DANN 训练流程DANN示例 GPT示例 前言 领域适应&#xff08;DA&#xff09;指的是当不同数据集的输入分布发生变化&#xff08;这种变化通常被称为共变量变…

Redis概览

Redis存储是Key-Value结构的数据&#xff0c;其中Key是字符串类型&#xff0c;Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…

解决Vue3 中Echarts数据更新渲染不上问题

解决办法就是让Dom节点重新渲染 定义一个变量 const postLoading ref(true); 请求数据前dom节点不渲染&#xff0c;获取完数据重新渲染

2024年1月阿里云服务器租用价格表_优惠活动大全

2024年1月最新阿里云服务器租用价格表&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月、2核4G服务器30元3个月&#xff0c;云服务器ECS可以选择经济型e实例、通用…

静态网页设计——中医中药网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV11e411i7g8/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

三种主流流协议的浏览器播放解决方案

三种主流流协议的浏览器播放解决方案 流协议介绍 主流的流协议&#xff08;streaming protocol&#xff09;包括HLS、RTMP、RTSP&#xff0c;下面依次介绍下三种视频流。 HLS HLS&#xff08;Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议&…

LeetCode-重复的子字符串(459)

题目描述&#xff1a; 给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 思路一&#xff1a; 使用枚举的方法。首先因为字符串s有一个子串重复多次构成&#xff0c;那么s的长度len与子串的长度subLen应该成倍数关系&#xff0c;并且在s中索…

C语言 B树的分析与实现

本文主要说明了B树的概念、应用以及如何用C语言实现B树。 概述 有使用过数据库的朋友都知道&#xff0c;数据库需要存储大量的数据&#xff0c;并且查询数据的性能也需要一定的保证。那么数据库的底层数据结构是如何实现的呢&#xff0c;就是我们要讨论的B树和B树&#xff0c…

ConcurrentHashMap的原理分析学习

ConcurrentHashMap 的初步使用及场景 CHM 的使用 ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap&#xff0c;所以ConcurrentHashMap 在并发编程的场景中使用的频率比较高&#xff0c;那么这一节课我们就从ConcurrentHashMap 的使用上以及源码层面来…

乐理燥废笔记

乐理燥废笔记 文章目录 终止式小调音阶转调不协和和弦进行大小转调1251 1451转调我的霹雳猫阿诺三全音代理五声音阶又怎样和弦附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什么是大端和小端数据传输中的大小端总结大小端转换…

设置代理IP地址对网络有什么影响?爬虫代理IP主要有哪些作用?

在互联网的广泛应用下&#xff0c;代理IP地址成为了一种常见的网络技术。代理IP地址可以改变用户的上网行为&#xff0c;进而影响网络访问的速度和安全性。本篇文章将探讨设置代理IP地址对网络的影响&#xff0c;以及爬虫代理IP的主要作用。 首先&#xff0c;让我们来了解一下代…

基于java,springboot的论旅游管理系统设计与实现

环境以及简介 基于java,springboot的论旅游管理系统设计与实现&#xff0c;Java项目&#xff0c;SpringBoot项目&#xff0c;含开发文档&#xff0c;源码&#xff0c;数据库以及ppt 源码下载 环境配置&#xff1a; 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服…

树莓派4B使用ncnn部署yolov5-Lite,推理耗时 247ms 包含前后处理

一. 引言 最近在玩树莓派&#xff0c;想在树莓派上不是一个目标检测算法&#xff0c;大致看了一下&#xff0c;目前开源的大家都在使用yolov5-Lite&#xff0c;使用ncnn去推理加速&#xff0c;于是自己也尝试部署&#xff0c;在此记录一下&#xff0c;个人踩的坑。 二. 版本选…

【算法笔记】状态机dp

状态机dp概述 当一个事件涉及的过程的考虑并且方案数的考虑比较繁琐时&#xff0c;我们可以尝试用状态机的思想去考虑这个问题&#xff0c;将这个问题简化&#xff0c;就是去考虑一个对象他所具有的几种状态。 状态机主要考虑一下两个方面&#xff1a;状态和转移 状态其实也…

如何在Ubuntu安装SVN服务并结合cpolar实现公网TCP地址远程访问本地服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

Mysql与Redis如何保证数据一致性问题

目录 一、Mysql与Redis同步数据是否存在延迟呢&#xff1f; 二、如何保证一致性&#xff1f; 2.1、第一种方式&#xff1a;手动编码 2.2、第二种方式&#xff1a;MQ异步更新 2.3、第三种方式&#xff1a;binlog同步数据 2.4、第四种方式&#xff1a;双写一致性 2.5、第五…