一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情
Hello,非常感谢你的关注~ 我是机器学习与风控,一名末流985的本硕,无顶会、无大厂核心部门实习,拥有多个比赛的竞赛经历,秋招刷了leetcode500题,在秋招提前批中收获字节跳动,腾讯,阿里,美团等大厂offer,最终选择入职字节风控,从事与黑产对抗的工作。我会定期分享我的春招、秋招亲身求职体验;算法岗日常工作;数据挖掘比赛,经典图模型等日常学习等有料也有趣的内容~秋招到了,欢迎各位私信找我内推!!!部门缺少开发,算法等岗位验证缺人。
HIVESQL记录
-
定义
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`
分桶表:进一步加速查询优化。数据会被按照分桶编号放在一起。分桶字段必须是表中已有的字段!分区表字段不能是表中已有字段!
分桶的有点:
- 给予分桶字段查询时候,减少扫描次数。
- 高效join
hive的事务表:支持acid特性,从行级别进行更新删除等操作。但是通常不用,不适合大数据。
views视图
是一种虚拟表,只保存定义,不实际存储数据,视图用来简化操作,不缓冲记录,也没有提高查询性能。