本文首发微信公众号:码上观世界

Iceberg作为一种表格式管理规范,其数据分为元数据和表数据。元数据和表数据独立存储,元数据目前支持存储在本地文件系统、HMS、Hadoop、JDBC数据库、AWS Glue和自定义存储。表数据支持本地文件系统、HDFS、S3、MinIO、OBS、OSS等。元数据存储基于HMS比较广泛,在这篇文章中,表数据存储基于MinIO、元数据存储主要基于HMS。实际上,基于HMS存储的元数据也只是很少的信息存储在HMS中,主体元数据还是存储在外部系统,如HDFS、MinIO等,所以这里也不得不提基于Hadoop存储的方式。

Iceberg的元数据管理通过Catalog类型指定,我们主要关注hive、hadoop和location_based_table这三种。

如果不指定任何Catalog类型,直接创建表会怎么样呢?

add jar /Users/deepexi/.m2/repository/org/apache/iceberg/iceberg-hive-runtime/0.13.2/iceberg-hive-runtime-0.13.2.jar;
SET hive.vectorized.execution.enabled=false;CREATE TABLE default.sample_local_hive_table_1(
id bigint, name string
)
PARTITIONED BY(
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

借助HiveIcebergStorageHandler,此时会在本地HMS(hive-site.xml中配置) 中存储元数据,元数据表table_params显示,当前表的存储位置使用了本地HMS (hive-site.xml中配置)的文件存储路径:

这符合创建Hive表的常规动作。来看看,如果指定hive的Catalog,并配置远程的HMS,会怎么样?

注册hive类型的Catalog

这里注册了一个远端的HMS地址:

SET iceberg.catalog.another_hive.type=hive;SET iceberg.catalog.another_hive.uri=thrift://10.201.0.202:49153;
SET iceberg.catalog.another_hive.warehouse=s3a://faas-ethan/warehouse/;
SET hive.vectorized.execution.enabled=false;

在当前HiveCli创建Hive Iceberg 表,同时指定location 存储位置,使用上面注册的hive类型的Catalog:

CREATE TABLE default.sample_hive_table_1(
id bigint, name string
)
PARTITIONED BY(
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 's3a://faas-ethan/warehouse/default/sample_hive_table_1'
TBLPROPERTIES ('iceberg.catalog'='another_hive');

到本地HMS(hive-site.xml中配置) table_params元数据表中确认当前表的存储参数:

Location信息存储在SDS表中。该表存储类型为MANAGED_TABLE。再到远程HMS(another_hive指定)的元数据表table_params看存储内容:

除了本地HMS存储的信息外,还多了有关Iceberg的统计信息、元数据位置信息。Location信息也同步复制了一份,存储在SDS表中,但该表存储类型变成了EXTERNAL_TABLE。由此可见,在Hive中创建Iceberg表,会在两边HMS分别存储一份元数据,只有这样,远端HMS中的Iceberg表才对本地HMS可见,所以必须保证远端HMS存在对应的数据库。如果在当前Hive Cli查看建表语句,会得到下面的输出:

show create table sample_hive_table_1;CREATE TABLE `sample_hive_table_1`(`id` bigint COMMENT 'from deserializer', `name` string COMMENT 'from deserializer', `dept` string COMMENT 'from deserializer')
ROW FORMAT SERDE 'org.apache.iceberg.mr.hive.HiveIcebergSerDe'
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
WITH SERDEPROPERTIES ( 'serialization.format'='1')
LOCATION's3a://faas-ethan/warehouse/default/sample_hive_table_1'
TBLPROPERTIES ('bucketing_version'='2', 'external.table.purge'='TRUE', 'iceberg.catalog'='another_hive', 'table_type'='ICEBERG', 'transient_lastDdlTime'='1659949858')
Time taken: 5.45 seconds, Fetched: 18 row(s)

这表示,Hive Cli返回的信息来自本地HMS,同普通Hive类似。

问题:如果只有远端HMS的Iceberg表,如何在本地HMS访问?

此时可以通过如下创建external外表的形式在本地HMS生成元数据:

CREATE EXTERNAL TABLE default.sample_hive_table_1(
id bigint, name string
)
PARTITIONED BY(
dept string
)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 's3a://faas-ethan/warehouse/default/sample_hive_table_1'
TBLPROPERTIES ('iceberg.catalog'='another_hive');

这有什么作用?试试下面的语句:

select * from default.sample_local_hive_table_1,sample_hive_table_1;

看到没?它通过Hive SQL实现了跨HMS的联邦查询!

注册Hadoop类型的Catalog

SET iceberg.catalog.hadoop_cat.type=hadoop;
SET iceberg.catalog.hadoop_cat.warehouse=s3a://faas-ethan/warehouse;

用注册的hadoop类型的Catalog,创建hadoop Iceberg表:

CREATE TABLE default.sample_hadoop_table_1(id bigint, name string) PARTITIONED BY (dept string)STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'LOCATION 's3a://faas-ethan/warehouse/default/sample_hadoop_table_1'TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');

如果你去看存储的元数据,会发现它跟使用hive类型的Catalog创建的表,少了metadata_location属性:

同时在MinIo中的metadata元数据文件多了version-hint.text:

这是因为两者管理当前最新元数据的版本机制不同。所以你不能基于hadoop类型的Catalog ,创建hive类型的Catalog 的Iceberg表。反过来也一样不行。

问题:当前表通过Hive Cli创建,所以会在HMS存储元数据,假如Iceberg表通过Iceberg API创建,HMS完全没有相关信息,那如何才能访问这种hadoop Iceberg表呢?

此时通过location指定hadoop中存储表的路径,然后通过EXTERNAL将在HMS中注册元数据,Hive会自动从中推断表Schema:

SET iceberg.catalog.hadoop_cat.type=hadoop;
SET iceberg.catalog.hadoop_cat.warehouse=s3a://faas-ethan/warehouse;CREATE EXTERNAL TABLE default.sample_hadoop_table_1
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 's3a://faas-ethan/warehouse/default/sample_hadoop_table_1'
TBLPROPERTIES ('iceberg.catalog'='hadoop_cat');

此时location必须符合格式:${iceberg.catalog.hadoop_cat.warehouse}/${dbName}/${tableName},否则无法识别存储格式。

上述创建外表的方式也可以使用下面的方式实现:

CREATE EXTERNAL TABLE default.sample_hadoop_table_1
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
location 's3a://faas-ethan/warehouse/default/sample_hadoop_table_1'
TBLPROPERTIES ('iceberg.catalog'='location_based_table');

In a nutshell

使用Hive SQL 创建 Iceberg表,你可以基于hive、hadoop和location_based_table类型的catalog创建Iceberg表,其中location_based_table可以看做hadoop类型的简化形式,并将外部HMS中的表通过外表的形式注册到当前HMS,从而实现Hive 的联邦查询,但是hive和hadoop类型的表在版本管理上略有不同,所以只能在同类型的catalog表上映射外表。另外,由于Hive 版本跨度较大,存在较多的不同版本的HMS兼容性问题,如HMS 3.x无法读取HMS 2.x的元数据等。

参考

https://iceberg.apache.org/docs/0.13.2/hive/

使用Hive SQL查询Iceberg表的正确姿势相关推荐

  1. Sql查询一个表中除了某个字段以外的所有字段的方法

    declare @name varchar(100) declare @sql varchar(1000)SET @sql='select ' DECLARE C11 CURSOR FORselect ...

  2. sql查询数据库表中重复数值

    sql查询数据库表中重复数值 -- 查询表中id重复的值 select id from 表名 group by id having count(*) > 1--查询表中的重复记录,重复记录是根据 ...

  3. SQL查询成绩表中的每科第三名

    SQL查询成绩表中的每科第三名 题目要求 表格数据 grade表 c_id c_no c_name 1 1 80 1 2 90 1 3 70 1 4 95 2 1 64 2 2 88 2 3 89 2 ...

  4. sql查询数据库表名

    查询数据库里所有表名和字段名的语句 SQL 查询所有表名: SELECT NAME FROM SYSOBJECTS WHERE TYPE='U' SELECT * FROM INFORMATION_S ...

  5. [数据库] SQL查询语句表行列转换及一行数据转换成两列

    本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法.子查询的应用.decode函数的用法.希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同 ...

  6. hive中使用iceberg表格式时锁表总结

    1. 原因 写入iceberg表时,会在hive_locks表中插入一条记录,表示该表正在被写入(hive中的独占锁) 当数据插入完成后,会自动删除该条记录. 2. 出现场景 (1)在同时往同一个ic ...

  7. SQL查询一个表中类别字段中Max()最大值对应的记录

    问题是: 数据库有一个表 code,里面有个点击量字段click_num和一个类别字段kind以及其它信息字段, 现在要搜出每个类别中点击量最大的那条记录,如果是10个类别,那么结果应该是10条记录, ...

  8. pythonpandas用sql查询数据表_pandas从数据库读取数据

    因为本周有一个是需要使用pandos做一个数据分析的需求,所以在这里做一下记录. Python中用Pandas进行数据分析,最常用的就是Dataframe数据结构, 这里我们主要介绍Pandas如何读 ...

  9. SQL查询单表数据之组合(三)

    [SQL从一点一滴分析系列文章]为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis .Hibernate 中的相关操作 点击查看 ...

最新文章

  1. 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的
  2. 没有匹配 if 的非法 else_求求你,别再写这么多if...else...了
  3. leetcode算法题--翻转单词顺序
  4. python百钱买百鸡问题算法_百钱买百鸡问题的伪代码算法?
  5. 深信服安全软件产品配置概况
  6. 如何将Outgoing Webhook部署到中国版Azure
  7. 第十二题:设int x=1,float y=2,则表达式x/y的值是:
  8. IOS网络请求的一些需要记录的info设置
  9. 拉勾数据岗位和热门编程语言现状分析
  10. 玩转华为ENSP模拟器系列 | 配置TWAMP统计业务示例
  11. Whiten process——数据的白化处理
  12. 计算机国二复习攻略,全国计算机等级考试二级复习指导及应试技巧二
  13. RT-Thread系统 STM32 DAC设备改进,直接调用系统DAC驱动函数设置输出电压
  14. “智慧新电商”全渠道获客+智能服务接待
  15. MRT批处理 MODIS影像
  16. 比较好用的服务器和网站在线测速工具分享
  17. 传说中的BNET边缘传输
  18. 图像压缩之基于神经网络压缩(BP)
  19. WebSocket + Redis简单快速实现Web网站单设备登录功能
  20. 数字政府智慧城市数字化运营管理中台建设思路分析

热门文章

  1. 金庸群侠传之武林浩荡1 7全隐藏完整攻略流程 图文
  2. 使用Share Sdk 实现第三方登录和分享
  3. 我学习与领悟的工匠精神
  4. Java的JSR规范
  5. 关于网络编程socket的listen底层的一点理解
  6. 木材涂刷木蜡油有什么作用?
  7. sql 打卡考勤记录查询
  8. 嘉立创PCB导出Gerber的方法(亲测有效)
  9. 抖音很火的卡通表白动态页面
  10. api-ms-win-core-path-l1-1-0.dll下载(win764位/32位)