赞
踩
注意:Trino 就是原来的 PrestoSQL,2020 年 12 月 27 日,PrestoSQL 项目更名为 Trino,Presto 分成两大分支:PrestoDB、PrestorSQL。
类型 | 描述 | 注意点 |
---|---|---|
boolean | 布尔类型,true或者false | |
int | 32位有符号整形 | 可以转换成long类型 |
long | 64位有符号整形 | |
float | 单精度浮点型 | 可以转换成double类型 |
double | 双精度浮点型 | |
decimal(P,S) | decimal(P,S) | P代表精度,决定总位数 S代表规模,决定小数位数。 P必须小于等于38。 |
date | 日期,不含时间和时区 | |
time | 时间,不含日期和时区 | 以微秒存储,1000微秒 = 1毫秒 |
timestamp | 不含时区的timestamp | 以微秒存储,1000微秒 = 1毫秒 |
timestamptz | 含时区的timestamp | 以微秒存储,1000微秒 = 1毫秒 |
string | 任意长度的字符串类型 | UTF-8编码 |
fixed(L) | 长度为L的固定长度字节数组 | |
binary | 任意长度的字节数组 | |
struct<…> | 任意数据类型组成的一个结构化字段 | |
list<E> | 任意数据类型组成的List | |
map<K,V> | 任意类型组成的K,V的Map |
操作 | Hive 2.x | Hive 3.1.2 |
---|---|---|
CREATE EXTERNAL TABLE | ✔️ | ✔️ |
CREATE TABLE | ✔️ | ✔️ |
DROP TABLE | ✔️ | ✔️ |
SELECT | ✔️ | ✔️ |
INSERT INTO | ✔️ | ✔️ |
<property>
<name>iceberg.engine.hive.enabled</name>
<value>true</value>
</property>
hive --service metastore &
# 在 Hive 中创建 iceberg 格式表 create table test_iceberg_tbl1( id int, name string, age int ) partitioned by (dt string) stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'; # 在 Hive 中加载如下两个包,在向 Hive 中插入数据时执行 MR 程序时需要使用到 hive (datalake)> add jar /bigdata/install/hive-3.1.2/lib/iceberg-hive-runtime-0.13.2.jar; hive (datalake)> add jar /bigdata/install/hive-3.1.2/lib/libfb303-0.9.3.jar; # 向表中插入数据 hive (datalake)> insert into test_iceberg_tbl1 values (1, 'zhangsan', 32, '20220706'); #查询表中的数据 hive (datalake)> select * from test_iceberg_tbl1; OK test_iceberg_tbl1.id test_iceberg_tbl1.name test_iceberg_tbl1.age test_iceberg_tbl1.dt 1 zhangsan 32 20220706 Time taken: 0.707 seconds, Fetched: 1 row(s)
# 注册一个 HiveCatalog 叫 another_hive hive (datalake)> set iceberg.catalog.another_hive.type = hive; # 在 Hive 中创建 iceberg 格式表 create table test_iceberg_tbl2( id int, name string, age int ) partitioned by (dt string) stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' tblproperties('iceberg.catalog'='another_hive'); # 插入数据,并查询 hive (datalake)> insert into test_iceberg_tbl2 values(2, 'lisi', 14, '20220706'); hive (datalake)> select * from test_iceberg_tbl2; OK test_iceberg_tbl2.id test_iceberg_tbl2.name test_iceberg_tbl2.age test_iceberg_tbl2.dt 2 lisi 14 20220706 Time taken: 0.371 seconds, Fetched: 1 row(s)
# 注册一个 HadoopCatalog 叫 hadoop
hive (datalake)> set iceberg.catalog.hadoop.type = hadoop;
# 使用 HadoopCatalog 时,必须设置“iceberg.catalog.<catalog_name>.warehouse”指定warehouse路径
hive (datalake)> set iceberg.catalog.hadoop.warehouse=hdfs://node01:8020/iceberg_data;
# 在 Hive 中创建 iceberg 格式表,这里创建成外表
create external table test_iceberg_tbl3(
id int,
name string,
age int
) partitioned by (dt string)
stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 'hdfs://node01:8020/iceberg_data/datalake/test_iceberg_tbl3'
tblproperties('iceberg.catalog'='hadoop');
# 插入数据,并查询
hive (datalake)> insert into test_iceberg_tbl3 values (3, "wangwu", 35, "20220706");
hive (datalake)> select * from test_iceberg_tbl3;
OK
test_iceberg_tbl3.id test_iceberg_tbl3.name test_iceberg_tbl3.age test_iceberg_tbl3.dt
3 wangwu 35 20220706
Time taken: 0.402 seconds, Fetched: 1 row(s)
create table test_iceberg_tbl4(
id int,
name string,
age int,
dt string
) stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 'hdfs://node01:8020/spark/person'
tblproperties('iceberg.catalog'='location_based_table');
# 在 Hive 中创建 iceberg 格式表 create table test_iceberg_tbl( id int, name string, age int ) partitioned by (dt string) stored by 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'; # 向表中插入数据 hive (datalake)> insert into test_iceberg_tbl values (1, 'zs', 13, '20220706'); hive (datalake)> insert into test_iceberg_tbl values (2, 'ls', 24, '20220706'); hive (datalake)> insert into test_iceberg_tbl values (3, 'ww', 35, '20220707'); hive (datalake)> insert into test_iceberg_tbl values (4, 'zl', 66, '20220707'); hive (datalake)> insert into test_iceberg_tbl values (5, 'tq', 47, '20220707'); # 查询 hive (datalake)> select * from test_iceberg_tbl; OK test_iceberg_tbl.id test_iceberg_tbl.name test_iceberg_tbl.age test_iceberg_tbl.dt 5 tq 47 20220707 1 zs 13 20220706 3 ww 35 20220707 4 zl 66 20220707 2 ls 24 20220706 Time taken: 0.382 seconds, Fetched: 5 row(s)
hdfs dfs -get /user/hive/warehouse/datalake.db/test_iceberg_tbl
# 树形结构查看
tree test_iceberg_tbl/
java -jar /bigdata/soft/avro-tools-1.11.0.jar tojson snap-*.avro
00005-0e6ad893-fd11-49e2-9dce-fd1d1d9091ea.metadata.json
元数据信息,解析当前元数据文件可以拿到当前表的快照id:“3196813301730135187” 以及这张表的所有快照信息,也就是 json 信息中 snapshots 数组对应的值。snap-3196813301730135187-1-1a71733b-232d-409d-9846-a626cb44593f.avro
。我们可以找到当前快照对应的路径,看到其包含的Manifest 清单文件有5个:added_data_files_count
、existing_data_files_count
、deleted_data_files_count
等属性信息,Iceberg 根据 deleted_data_files_count 大于 0 来判断对应的 manifest 清单文件里面是不是被删除的数据,如果一个 manifest 清单文件该值大于 0 代表数据删除,读数据时就无需读这个 manifest 清单文件对应的数据文件。spark.read.option("snapshot-id", 4259769591722561320L).format("iceberg").load("path")
spark.read.option("as-of-timestamp", "时间戳").format("iceberg").load("path")
*.metadata.json
文件中,除了有“current-snapshot-id”、“snapshots”属性外还有“snapshot-log”属性,该属性对应的值如下:Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。