hive 建表方式及参数详解

hive 建表方式及参数详解,第1张

   hive中有两种表:外部表和内部表(managed and external)。可以通过 desc formatted table_name 命令来查看表的信息,来辨别表是外部表还是内部表。 在hive默认创建到表是内部表,外部表创建需要加 EXTERNAL 命令,如: CREATE EXTERNAL table_name 。

   内部表的文件,元数据和统计信息等由hive进行管理,一般被存储在 hivemetastorewarehousedir 目录下,当表被删除或者分区被删除,相对应的数据和元数据就会被删除。一般用来当做临时表。

外部表与内部表相反,可以指定location,可以不基于hive来 *** 作外部表文件。当表被删除或者分区被删除时对应的数据还会存在。只是hive删除了其元信息,表的数据文件依然存在于文件系统中。若是表被删除,可以重新建这个表,指定location到数据文件处,然后通过msck repair table table_name命令刷新数据的元信息到hive中,也就是恢复了数据。

   msck repair table 的详细用法就不讲了,可以参考 HIVE常用命令之MSCK REPAIR TABLE命令简述

看到这篇文章的同学相信都是 大数据相关技术爱好者 、从业人员或者业界大佬。这篇文章篇基础,属于上手性指引,如有不对的地方欢迎指正

文章的源代码github地址在文末

为什么要有 UDF

纵然 内置函数(Build-in Function)再丰富,也会遇到 无法完全满足我们特定场景的需要,这时我们需要 UDF;或者我们通过内置函数可以实现,但是业务代码冗长,又或者业务代码不仅冗长而且可能要多处维护,那么这时候我们需要 UDF。

强如 Oracle 这一霸占传统金融行业大部分数据库份额的厂商,一样提供 用户自定义函数的接口,Hive 这一开源生态的神级项目,自然也不会少。

总之:UDF 就是为灵活性而存在,为可扩展性而存在

选择合适的 UDF

按照不同使用场景需要, Hive 已经为我们将 UDF 归为3类,分别对应3种不同使用场景

1 转换函数 UDF :适用于行级别转换 *** 作,数据行中的一列后者几列,生成一列或者几列,效果可参照 内置函数的 upper() 讲一列的字符串所有字符 统一转换为 大写字符;

2 聚合函数 UDAF: 适用与多行进行聚合成一行,或者多行分组聚合成相对小的多行,效果参照 内置函数 sum() ,一般配合 group by 使用较多

3 表生成函数 UDTF: 适用一行生成多行场景 ,效果参照 内置函数 explode()

实现你的 UDF 逻辑

1 转换函数UDF 实现

以前在 Oracle 上使用 decode 做 枚举型值转译用得方便,到 hive 上了 没有这么方便的函数,只能用 case when 或者 if 这种相对繁琐,代码行数偏大

为实现这个UDF,我们需要继承Hive相应类,实现3个函数

1 第一个函数,初始化:这里做2个事情

1> 检查传入字段的合法性,我这里函数使用时传入参数必须是大于等于4个的 偶数,参照 oracle decode

2> 我这里返回的是 字符串类型(如果你在这里有疑问:为什么返回字符串要这样做, 我在第二篇中努力讲清楚)

如果有些需要共享连接之类资源的场景,也可以在这里做,这个方法是 每生成一个 mapper对象 执行一次,也可以理解: MR 中 每个 parttion 才执行一次 ,我在实际工作中有一个 需要远端解密的场景就用到了

2 第二个函数,是真正转换函数

3 第三个函数,hive收集元数据信息的函数

2 聚合函数 UDAF实现:

抱歉,我并没有合适的公开的 案例代码直接贴出来,后面有合适的

3 表生成函数 UDTF 实现:

表生成函数有很多使用场景,我这直接上我的实例:我们在 实际数据仓库研发中,对缓慢变化维度 经常使用 拉链表 来实现;而在 hive 中是不支持 不等值条件写在 on 条件里 ,只能通过 where 子句实现,但 where 子句明显是过程中产生 笛卡尔积 的做法,

为规避这个情况 写了一个通用的 日粒度拉链表 爆炸展开的 函数, 我们在 与事实表连接时 将很方便地实现 等值连接,也方便 HIve 或者 Spark 的 执行计划 优化,避免全量的shulffe,等值join 会方便 按连接键分区

实现UDTF 需要继承 相应类,实现 3个函数

1 第一个函数,初始化:所做事情参照 UDF

2 第二个函数,循环生成记录并 通过 forward 函数输出

3 第三个函数,关闭函数,按需使用

我这里什么都没做

注册UDF 函数

临时 UDF,当前会话

永久且全局 UDF

这样做之后,会在 hive 的元数据库中查到函数的信息,若遇到 跨 session 无法使用,可选择 在相应的 session 中做函数重载

全局 UDF 不仅可在 Hive 中使用,亦可在 spark sql 中使用 ,hive 的 hiveserver2 的其他 jdbc/odbc 连接中使用

[这篇文章完整代码在我的 github 上开源项目中,其中包含 类decode/日期转 星座 /IPv4与整数互转 以及适用 拉链表爆炸展开的表生成函数](>

#hive相关资料

#>

Impala 获取hive 的 metadata

Impala 通常和Hive共用同一个metadata 数据库(通常是MySQL/PostgreSQL), 所以Impala 能够读取到Hive的元数据信息 如果Impala需要访问Hive表, 需要将Hive metadata 刷新到impala中

在Hive中Create/Drop表后, 或者HDFS rebalance,或者手工删除HDFS的文件后, 则需要在impala中执行下面两行命令:

INVALIDATE METADATA table_name;

describe table_name;

第一行命令 INVALIDATE METADATA 告诉impala 指定的 table 元数据已经过期, impala 将在下一次使用到该表时自动刷新元数据, 第二行命令即触发impala去更新元数据, 以免将来真正使用该表耗时太久

如果Impala已经知道了Hive表的存在后, 又通过Hive增加或删除分区或alter table, 使用 refresh 命令即可更新元数据 refresh是对元数据进行增量更新, 和INVALIDATE METADATA相比, refresh命令使用成本低很多

利用catalogd提供元数据服务。可以直接连DB也可以通过catalogd,一般是利用hive里的metastore获取数据。Impala高效的原因是其将原始数据缓存下来,catalogd启动会浏览缓存获取数据

因为impla默认catalogd会缓存,因此如果你重启的后,catalogd会将缓存数据存入到内存中,

hive优化除了有hql语句逻辑优化,hql参数调优等等,还有一个不起眼的细节容易被忽视掉, 那便是hive数仓模型表的存储格式和压缩方式 ,hive底层数据是依托在hadoop,以HDFS文件存储在集群上的, hive数仓模型表选择一个合适的存储格式和压缩方式也是hive优化的一点

本篇就来聊一聊这块知识点吧。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9709449.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存