【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]

说明:

  1. CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
  2. EXTERNAL关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
  3. LIKE 允许用户复制现有的表结构,但是不复制数据。
  4. 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 确定表的具体的列的数据。
  5. STORED AS SEQUENCEFILE|TEXTFILE|RCFILE
    如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。
  6. 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表数据的导出(不详细介绍了)

未完待续!!!
!!!!!!
在这里插入图片描述

发布了2 篇原创文章 · 获赞 3 · 访问量 91

猜你喜欢

转载自blog.csdn.net/weixin_45783164/article/details/104548396