【hadoop】hive实操命令and基本命令介绍
文章目录
前言
上一篇安装好hive后,就开始做实验了,命令要多敲敲哦
1. 数据库操作:
数据库操作 | 命令 | 补充知识点 |
---|---|---|
创建数据库 | create datdabase if not exists myhive; | 表默认存放的位置在/user/hive/warehouse |
create database myhive2 location ‘/myhive2’; | 创建数据库并指定hdfs存储位置 | |
使用数据库 | use myhive; | |
修改数据库 | alter database myhive2 set … | 但是数据库的元数据信息不可更改,包括数据库的名称以及数据库所在的位置 |
查看数据库信息 | desc database myhive2; | |
删除数据库 | Drop database myhive2; | 这是删除空的数据库 |
Drop database myhive cascade; | 强制删除数据库,包括数据库下面的表 |
2. 表创建的字段介绍:
创建数据库表语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMATrow_format]
[STORED AS file_format] [LOCATION hdfs_path]
说明:
- CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
- EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
- LIKE 允许用户复制现有的表结构,但是不复制数据。
-
ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive通过 SerDe 确定表的具体的列的数据。 -
STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。 -
CLUSTERED BY
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
把表(或者分区)组织成桶(Bucket)有两个理由:
-
i.获得更高的查询处理效率。桶为表加上了额外的结构,Hive
在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。 -
ii.使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
3.管理表和外部表:
1. 管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
2.管理表
管理表(内部表)操作 | 命令 | 补充的点 |
---|---|---|
创建表并指定指端之间的分隔符、存储的形式、存储的位置 | create table if not exists stu2(id int,name string)row format delimited fields terminated by ‘\t’ stored as textfile location ‘/user/stu2’; | 橙色:指定分隔符为table; 粉色:存储为文本;紫色:指定在hdfs存储的位置 |
根据查询结果创建表 | create table stu3 as select *from stu2; | |
根据已经存在的表结构创建表 | create table stu4 like stu2; | |
查询表的类型 | desc formatted stu2; |
3.外部表:
外部表说明:
外部表因为是指定其他的hdfs路径的数据加载到表当中来,所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉
外部表的操作 | 代码 | 补充的点 |
---|---|---|
创建外部表 | create external table teacher (t_id string,name string) row format delimited fields terminated by ‘\t’; create external table student (s_id string,s_name string,s_birth string,s_sex string) row format delimited fields terminated by ‘\t’; | 为后面的实验创建两张外部表分别是学生表 教师表 |
从本地文件系统向表中加载数据 | load data local inpath ‘/export/servers/hivedatas/student.csv’ into table student; | |
load data local inpath ‘/export/servers/hivedatas/student.csv’ overwrite into table student; | Overwrite:加载数据的时候覆盖已有数据 | |
从hdfs向表中加载数据 | load data inpath ‘/hivedatas/teacher.scv’ into table teacher; | 前提是把数据上传到hdfs上 |
把数据上传到hdfs上(teacher.csv是我实现准备的数据)
cd /export/servers/hivedatas
hdfs dfs -mkdir -p /hivedatasHdfs dfs -put teacher.csv /hivedatas/
4. 分区表:
• 理解:
在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小的文件就会容易得多了(不需要全表查询)
分区表操作 | 代码 | 补充的点 |
---|---|---|
创建分区表 | create table score(s_id string,c_id string,s_score int) partitoned by (month string) row format delimited fields terminated by ‘/t’; | 创建分区表的时候也可以多个分区比如:(year string,month string,day string) |
加载数据到分区表中 | load data local inpath ‘/export/servers/hivedatas/score.csv’ into table score partition (month=‘202001’); | 也可加载到多个分区(year’2020,month=‘01’,day=‘01’) |
多分区联合查询 | union all | |
查看分区 | show partition score; | |
添加一个分区 | alter table score add partition(month=‘202002’); | |
同时添加多个分区 | alter table score add partition(month=‘202003’) partition(month =‘202004’); | 注意:添加分区之后就可以再hdfs当中看到表下面多了一个文件夹 |
删除分区 | alter table score drop partition(month=‘202004’); | |
表的修复 | msck repair table score4 | 建立表与数据文件之间的关系映射 |
msck repair table score4
对修复表的应用场景理解:
需求描述:日志文件每天都会生成,会给他存在hdfs上,比如对应于/scoredatas/month=202005里面,要把它加载到hive的表里面,进行数据统计分析。用这个语句就能自动的把数据加载到表当中
(或者可以选择alter手动去添加分区)
5. 分桶表:
• 理解:
将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去。适用于不适合做分区的数据。实际生产环境中,还是分区用的多
• 分桶的原理:就像mapreduce里面的hash分区一样
MR中:按照key的hash值取模除以reducetask的个数
hive中:按照分桶字段的hash值取模除以分桶的个数决定一条记录应该存放在哪个桶当中
分桶操作 | 代码 | 补充的点 |
---|---|---|
开启hive的桶表功能 | set hive.enforce.bucketing=true; | |
设置reduce的个数 | set mapreduce.job.reduces=3; | |
创建分桶表 | create table course (c_id string,c_name string.t_id string)clusterd by(c_id) into 3 buckets row format delimited fields terminated by ‘\t’; | 分了三个桶 |
用insert overwrite 加载数据 | 1、创建普通表:create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated bt ‘\t’; | |
2、往普通表中加载数据:load data local inpath ‘/export/………/course.csv’into table course_common; | ||
3、通过inser overwrite给桶:insert overwrite table course select *from couurse_common cluster by(c_id); | 分桶用 hdfs dfs -put或者load data都不太好 |
6. 修改表:
描述命令 | 命令 | 补充的点 |
---|---|---|
表重命名 | Alter table score4 rename score5 | 把表4改名成表5 |
查询表结构 | desc score5; | |
添加列 | alter table score5 add colums (mycol string,mysco string) | |
更新列 | alter table score5 change column mysco mysconew int; | 把列mysco改成了mysconew 并把属性改成了int |
删除表 | drop table score5; |
7. 往hive表中加载数据
描述 | 命令 | 补充 |
---|---|---|
直接向分区表中插入数据 | Insert into table score3 partition(month=‘202001’) values(‘001’,‘002’,‘100’); | |
通过load方式加载数据 | Load data local inpath ‘/export/servers/hivedatas/score.csv’ overwrite into table score partition(month=‘202002’); | overwrite会覆盖 |
通过查询的方式加载数据 | Insert overwrite table score4 partition(month=‘202003’) select s_id,c_id,s_score from score; | overwrite不能省略哦! |
用查询语句创建表并加载数据 | Create table score5 as select *from score; | |
创建表时指定location加载数据 | create external table score6 (s_id string,c_id string,s_score int) row format delimited fields terminated by ‘\t’ location ‘/myscore6’;hdfs dfs -put score.csv /myscore6; |
多插入模式:
1、给原表score加载数据(load)
2、创建第一部分、第二部分表(create table)
3、分别给第一部分和第二部分加载数据
from score
insert overwrite table score_first partition(month='201806') select s_id,c_id
insert overwrite table score_second partition(month = '201806') select c_id,s_score;
常用于实际生产环境当中,讲一张表拆成两部分或者多部分
8. 清空表数据:(只能清空内部表)
Truncate table 内部表名;
9. hive表数据的导出(不详细介绍了)
未完待续!!!
!!!!!!