问题导读
1.Iceberg包含哪些特点?
2.Iceberg官网提供哪些包?
3.Iceberg有哪些数据类型?
4.Iceberg隐藏分区有什么作用?
1 Iceberg简介
设计初衷是:以类似于SQL的形式高性能的处理大型的开放式表
特点
- 模式演化支持添加,删除,更新或重命名,并且没有副作用
- 隐藏分区可以防止导致错误提示或非常慢查询的用户错误
- 分区布局演变可以随着数据量或查询模式的变化而更新表的布局
- 快照控制 可实现使用完全相同的表快照的可重复查询,或者使用户轻松检查更改
- 版本回滚使用户可以通过将表重置为良好状态来快速纠正问题
- 快速扫描数据 无需使用分布式SQL引擎即可读取表或查找文件
- 数据修剪优化 使用表元数据使用分区和列级统计信息修剪数据文件
- 兼容性好 ,可以存储在任意的云存储系统和HDFS中
- 支持事务 序列化隔离 表更改是原子性的,读者永远不会看到部分更改或未提交的更改
- 高并发 高并发写入器使用乐观并发,即使写入冲突,也会重试以确保兼容更新成功
2 基本概念
2.1 下载
Iceberg使用嵌入式程序的方式工作, 我们在使用的时候只需要添加响应的jar包,指定响应的工作类即可运行工作 !
下载地址: http://iceberg.apache.org/releases/
2.2 数据类型Type | Description | Notes | boolean | True or false |
| int | 32-bit signed integers | Can promote to long | long | 64-bit signed integers |
| float | 32-bit IEEE 754 floating point | Can promote to double | double | 64-bit IEEE 754 floating point |
| decimal(P,S) | Fixed-point decimal; precision P, scale S | Scale is fixed and precision must be 38 or less | date | Calendar date without timezone or time |
| time | Time of day without date, timezone | Stored as microseconds | timestamp | Timestamp without timezone | Stored as microseconds | timestamptz | Timestamp with timezone | Stored as microseconds | string | Arbitrary-length character sequences | Encoded with UTF-8 | fixed(L) | Fixed-length byte array of length L |
| binary | Arbitrary-length byte array |
| struct<...> | A record with named fields of any data type |
| list<E> | A list with elements of any data type |
| map<K, V> | A map with keys and values of any data type |
|
2.3 分区
对比hive中的分区: 将表中的数据以行数据为特征的数据以文件夹管理 , 在以分区字段查询数据的时候,可以只扫描指定分区文件夹中的数据,减少数据检索的范围 ,从而增加查询数据的效率!但是hive中的分区必须指定分区查询数据 , 如果没有指定,或者指定的不标准就无法提升效率 !
比如 hive中有个分区是以小时为分区的
partition(event_time=’20201211 12:00:00’)那么我们查询数据的时候必须标准的指定分区字段和值进行查询数据
Select * from tb_log where event_time=’20201211 12:00:00’ ;
它不知道的是这个分区是20201211这天的数据,所以我们查询
Select * from tb_log where event_dt=’20201211’ ;并没有减少数据检索范围 !
Hive分区的问题
Hive无法验证分区值–由编写者来产生正确的值
使用错误的格式,2018-12-01而不是20181201,会产生无提示的错误结果,而不是查询失败
使用错误的源列(如processing_time或时区)也会导致错误的结果,而不是失败
由用户来正确编写查询
使用错误的格式也会导致无提示的错误结果
不了解表物理布局的用户会收到不必要的缓慢查询– Hive无法自动转换过滤器
工作查询与表的分区方案相关,因此在不中断查询的情况下不能更改分区配置
Iceberg隐藏分区
Iceberg通过获取列值并可选地对其进行转换来生成分区值。Iceberg负责将转换event_time为event_date,并跟踪关系。
使用这些关系配置表分区。该logs表将被date(event_time)和分割level。
因为Iceberg不需要用户维护的分区列,所以它可以隐藏分区。分区值每次都会正确生成,并在可能时始终用于加速查询。生产者和消费者甚至都看不到event_date。
最重要的是,查询不再取决于表的物理布局。通过物理和逻辑之间的分隔,Iceberg表可以随着数据量的变化随着时间的推移发展分区方案。错误配置的表可以得到修复,而无需进行昂贵的迁移。
2.4 表优化
隐式分区优化表结构 , 可以灵活快速的处理表数据 ,方便根据需求来重新定义分区 !
例如,Hive表分区不能更改,因此从每日分区布局更改为每小时分区布局需要一个新表。并且由于查询依赖于分区,因此必须为新表重写查询。在某些情况下,甚至不支持重命名列之类的简单更改,也可能导致数据正确性问题。
- 支持表结构的修改
- 修改表结构后可以保证数据的正确性
- 添加的列永远不会从另一列读取现有值。
- 删除列或字段不会更改任何其他列中的值。
- 更新列或字段不会更改任何其他列中的值。
- 更改结构中列或字段的顺序不会更改与列或字段名称关联的值。
Iceberg使用唯一的ID来跟踪表中的每一列。添加列时,将为其分配新的ID,因此不会错误地使用现有数据。
Iceberg中的每次操作都会记录成快照和时间戳,方便数据更新和增量查询!
修改后的别结构和修改前的表结构是可以共存的
2008年的数据按月划分。从2009年开始,将更新该表,以便按天对数据进行分区。两种分区布局都可以共存于同一张表中。
Iceberg使用隐藏分区,因此您无需为特定分区布局编写查询就可以很快。相反,您可以编写查询来选择所需的数据,然后Iceberg会自动修剪不包含匹配数据的文件。
分区演变是一个元数据操作,不会急于重写文件。
最新经典文章,欢迎关注公众号
原文链接https://blog.csdn.net/qq_37933018/article/details/111309144
|