本质:就是将对应的HQL语句转换为对应的MapReduce进行数据的计算(仅仅针对执行引擎是MapReduce)
出现的原因:MR实现复杂.
本质:就是将对应的HQL语句转换为对应的MapReduce任务,然后提交对应的MapReduce任务,通过yarn资源管理系统调用对应的资源。
注意:包含 * 的全表查询不会生产MapReduce任务,不含对应的条件限制
包含* 的limit查询也不会生产MapReduce任务,select * from table1 limit 3
元数据:包含对应的hive的服务信息(就是对应的数据存放发位置,对应的服务器连接信息),对应的数据库,数据表的信息
注意:这里hadoop是老版本,新版本的任务调度是建立在yarn上的
HQL语句的执行步骤:注意这里的序号与图中的序号无关。
1,解析对应的语句,检查是否有语法等错误。
2,编译成对应的mapreduce对应的job
3,对应的数据放入到元数据中,关于对应的涉及的表的信息。
4,优化job,提交对应的job执行计划。
5,交给yarn管理。
use database 切换数据库
desc database 数据库名 ------------》 查看基础信息
desc database extended 数据库名 -----------》 查看基础信息
describe database extended 数据库名 -----------》 查看数据库信息
drop database 数据库名 ------》 删除数据库,只能删除空的数据库
drop database 数据库名 cascade -------->级联删除数据库
show current_database() ------->查看当前数据库
读写模式
- 写时模式
在传统的数据库里,表的模式是在数据加载时强制确定的。如果在加载时发现数据不符合模式,则拒绝加载数据。因为数据在写入数据库时对照模式进行检查,因此这一设计有时被称为“写时模式”。
2.读时模式
而在Hive中,对数据的验证并不在加载数据的时候进行,而是在查询时进行,这被称为“读时模式”。
用户需要在这两种方法之间进行权衡。读时模式可以使数据加载非常迅速,这是因为它不需要读取数据,进行“解析”,再进行序列化以数据库内部格式存入磁盘。数据加载操作仅仅是文件复制或移动。这一方法更为灵活:试想,针对不同的分析任务,同一个数据可能会有两个模式。Hive使用“外部表”时,这种情况也是可能发生的。
写时模式有利于提升查询性能。因为数据库可以对列进行索引,并对数据进行压缩。但作为权衡,此时加载数据会花更多时间。此外,在很多加载时模式未知的情况下,因为查询尚未确定,因此不能决定使用何种索引。
注意: 在Hive上建立数据库和建立表,就是在hdsf中建立了一个目录
Hive的表在逻辑上由存储的数据和描述表中数据形式的相关元数据组成。数据一般存放在HDFS中,或是其他任何Hadoop文件系统中,包括本地文件系统或S3。Hive把元数据存储在关系型数据库中(metastore)。
注意:当Hive用mysql作为元数据的存放时,数据库的信息是放在 DBS中,
而表的信息放在:TBLS中
注意:对应的表如何获取数据和存放数据,是根据通过
1,保存对应数据的目录下的文件
2,以及存放对应的表结构的的信息存放在元数据库中。
这里的坑:指的是文件路径是服务端
注意:加载本地文件是拷贝文件到hdfs,而从HDFS上加载,者是文件移动
可以from tb_user insert into u2 select filed 导入指定列
注意:
create table if not exit tb_name2 like tb_name1 location '文件对应的位置'
// 仅仅是复制了对应的表的结构,没有复制对应的数据,所有不会创建对应的文件路径
内部表与外部表的互换
!linux命令-------》在hive的命令行执行linux命令
5.6 显示当前数据库
在hive的conf目录下编辑一个 .hiverc文件,可以直接在该文件中设置
hive.cli.print.current.db=true
表示调试时,在本地跑,不是集群模式。
注意:order by 和 sort by的区别
- order by是对整个集群文件进行排序,最后排序后的文件是有序的,但是占用内存大
- sort by是对disturbute by 是对分区进行排序。
将查询出来的结果放到临时表
create temp
select * from ,,,,,,
合并成map
窗口函数:存在的意义解决非必要的连表操作;主要用于分组的数据操作,但传统的数据分组,对分组后的数据操作后,每个分组仅仅返回一条数据;而over可以对每一条记录都返回对应的分组计算的结果
(旧思路:将要查询的数据和对应的分组统计的结果放在临时表中进行连表查询)
通过 over(指定在对应窗口的数据的内容),over中的数据和主sql是并行操作。
distribute by 是用于over窗口函数的分组操作
sort by 就是针对 distribute by 对窗口函数中的数据排序
sort by是窗口组内中降序
partition by , group by ,distrubute by 的区别,以及sort by ,order by
- group by分组之后是会组内聚合的而后两者仅仅是分组了,并未有聚合操作
- partition by是分区 Distribute by 可以理解为分簇
- partition by是分区 区内排序用order by
- Distribute by 可以理解为分簇 簇内排序用sort by 另外当 distribute by 和 sorts by 后的字段相同时,可以使用 cluster by 方式
partitioned by (分区名 string) 按所分区名分区建表使用
clustered by(列名) 按列分桶建表使用
注意:在over函数中使用partition by是把窗口中的内容都当中对应的对应的分区,对整个分区操作
注意:range 和rows的区别:
select
name,
score,
sum(score) over(order by score range between 2 preceding and 2 following) s1, -- 当前行的score值加减2的范围内的所有行
sum(score) over(order by score rows between 2 preceding and 2 following) s2, -- 当前行+前后2行,一共5行
sum(score) over(order by score range between unbounded preceding and unbounded following) s3, -- 全部行,不做限制
sum(score) over(order by score rows between unbounded preceding and unbounded following) s4, -- 全部行,不做限制
sum(score) over(order by score) s5, -- 第一行到当前行(和当前行相同score值的所有行都会包含进去)
sum(score) over(order by score rows between unbounded preceding and current row) s6, -- 第一行到当前行(和当前行相同score值的其他行不会包含进去,这是和上面的区别)
sum(score) over(order by score rows between 3 preceding and current row) s7, -- 当前行+往前3行
sum(score) over(order by score rows between 3 preceding and 1 following) s8, --当前行+往前3行+往后1行
sum(score) over(order by score rows between current row and unbounded following) s9 --当前行+往后所有行
from
tmp.tmp_student
order by
score;
————————————————
原文链接:https://blog.csdn.net/HappyRocking/article/details/105369558
/**
* @Auther: gaojiaxue
* @Date: 2021/12/21 09:49
* @Description: hive的自定义函数
*/
public class MyFunction extends UDF {
/**
* 所有自定义的函数的执行方法都是写在这个方法里,自定义的函数通过,hive命令导入jar包时命名
* @param str
* @return
*/
public String evaluate(String str){
return str+"!";
}
}
注意:用指定的配置文件加载,不会走默认的配置文件。
9.1 列分区
对应的分区的列,是一个伪字段。该字段不存放数据,仅仅用来分区,该字段不是对应的数据,只是导入时,指定了对应 的伪字段的值。
分区本质:就是对数据建立子目录,子目录名就是:对应字段=值。
注意:删除partition时,不同的加载分区的数据会有不同的效果。
load data "数据文件" into table:不会删除对应的目录
add partition() location 的方式会删除对应的目录。
注意:partition(分区字段=值)会自动将对应的值转为字符串,所以01是int性会变为1 ,要添加引号
桶分区(列分区)
Hive组织表到分区。它是将一个表到基于分区列,如日期,城市和部门的值相关方式。使用分区,很容易对数据进行部分查询。
表或分区是细分成桶,以提供额外的结构,可以使用更高效的查询的数据。桶的工作是基于表的一些列的散列函数值。
例如,一个名为Tab1表包含雇员数据,如 id, name, dept 和yoj (即加盟年份)。假设需要检索所有在2012年加入,查询搜索整个表所需的信息员工的详细信息。但是,如果用年份分区雇员数据并将其存储在一个单独的文件,它减少了查询处理时间。下面的示例演示如何分区的文件和数据:
下面文件包含employee 数据表。
/tab1/employeedata/file1
id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel,SC, 2013
4, Prasanth, SC, 2013
上面的数据被划分成使用年两个文件。
/tab1/employeedata/2012/file2
1, gopal, TP, 2012
2, kiran, HR, 2012
/tab1/employeedata/2013/file3
3, kaleel,SC, 2013
4, Prasanth, SC, 2013
9.1.1
添加分区
可以通过添加分区表改变所述表。假设我们有一个表叫employee ,拥有如 Id, Name, Salary, Designation, Dept, 和 yoj等字段。
语法:
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)
以下查询用于将分区添加到employee表。
hive> ALTER TABLE employee
> ADD PARTITION (year=’2012’)
> location '/2012/part2012';
重命名分区
此命令的语法如下。
ALTER TABLE table_name PARTITION partition_spec
RENAME TO PARTITION partition_spec;
以下查询用来命名一个分区:
hive> ALTER TABLE employee PARTITION (year=’1203’)
> RENAME TO PARTITION (Yoj=’1203’);
删除分区
下面语法用于删除分区:
ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,
PARTITION partition_spec,...;
以下查询是用来删除分区:
hive> ALTER TABLE employee DROP [IF EXISTS]
> PARTITION (year=’1203’);
动态分区
默认的序列化:lazySimpleSerde的解析方式
2,CSV方式
注意:对应的表的字段和json在对应的key要对应上,
若json的格式错误,select 可能会出错。
注意:当json文件中的key是一个关键字是,可以用
create table if not exit rating(
movie int,
rate int,
time_stamp string,
uid int
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with sedeproperties(
"igore.malformed.json"="true",
"mapping.time_stamp"="timestamp"
)
v
drop index index_name
注意:修改视图仅仅是修改对应的查询语句。
注意:区分对应的hive压缩和对应的之前的hive表数据的存储文件的压缩的区别。
- hive压缩是对应HQL语句,映射成对应的MapReduce后的任务产生的结果的压缩
- hive压缩有两个阶段,Map和对应Reduce,其中Map是对应的中间结果,Reduce是最终结果
- hive表创建时指定的压缩,是指对应的数据文件的存储格式