HIVESQL第一天

125 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情 

Hello,非常感谢你的关注~ 我是机器学习与风控,一名末流985的本硕,无顶会、无大厂核心部门实习,拥有多个比赛的竞赛经历,秋招刷了leetcode500题,在秋招提前批中收获字节跳动,腾讯,阿里,美团等大厂offer,最终选择入职字节风控,从事与黑产对抗的工作。我会定期分享我的春招、秋招亲身求职体验;算法岗日常工作;数据挖掘比赛,经典图模型等日常学习等有料也有趣的内容~秋招到了,欢迎各位私信找我内推!!!部门缺少开发,算法等岗位验证缺人。

HIVESQL记录

  1. 定义

Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。

Hive核心是讲HQL转换为MapReduce程序,然后讲程序提交到Hadoop群集执行。

metadata保存了关键信息,例如:实际存放在hdfs的位置,表的列对应字段,文件之间的分隔符。

\

架构:

用户接口:3种写hive的方式。命令行,jdbs,web。

元数据存储:以关系数据的形式存储在关系数据库。

驱动程序:包含解析器,任务计划,优化器,执行器。完成数据的解析,任务安排,任务优化与执行。

执行引擎:3种,大多mr。

\

hive的table特性:

  • Hive中表对应的数据存储在HDFS中,二表相关的元数据存储在RDBMS。
  • Hive中的表达数据在HDFS上的存储路径为:${hive.metastore.warehouse.dir}/databasename.db/tablename

\

partition 分区:

是hive的一种表优化方式,更快检索的目的。

在存储层面的表示就是每个分区对应hdfs的一个文件夹。

bucket 分桶:

hive的另一表优化方式。

在存储层面表示就是每个文件夹下有多个文件,把原始的一个文件通过hash分成多个文件从而更快进行join等操作。

\

元数据存储通过metastore进行管理,对外暴露服务地址,让各种客户端通过链接metastore服务,由metastore再去连接MySQL数据库来存取元数据。保障hive元数据的安全。metastore 实现通常采用mysql,还有一个默认的derby进行存储,但是该一次只能支持一个活动用户,适用于测试体检,不适用于生产环境。

\

内部表:通常不指定的就是内部表,hive 管理元数据的生命周期和表数据的生命周期。删除内部表时,会删除数据以及表的元数据。

外部表:删除外部表只删除了元数据,即映射关系,表的内容还在hdfs上。

分区表:

Hive表对应的数据量大、文件个数多时,为了避免查询时权标扫描数据,Hive支持指定的字段对表进行分区

分区字段不能以列名出现在创建表,因为分区字段本身也是一列字段。

静态分区表:分区的属性值是由用户在加载数据的时候手动指定的。

多重分区表:分区的递进关系。

partitioned by(province string, city string)

动态分区表:分区的字段值是基于查询结果自动推断出来的,核心语法是insert + select。这个没用过。

`-- 执行动态分区查询

insert into table t_all_hero_part_dynamic partition (role)

select t.*, t.role_main from t_all_hero t; -- 注意顺序 t.role_main 对应 role`

分桶表:进一步加速查询优化。数据会被按照分桶编号放在一起。分桶字段必须是表中已有的字段!分区表字段不能是表中已有字段!

分桶的有点:

  1. 给予分桶字段查询时候,减少扫描次数。
  2. 高效join

hive的事务表:支持acid特性,从行级别进行更新删除等操作。但是通常不用,不适合大数据。

views视图

是一种虚拟表,只保存定义,不实际存储数据,视图用来简化操作,不缓冲记录,也没有提高查询性能。