欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【hadoop】hive实操命令and基本命令介绍

程序员文章站 2024-03-23 08:14:22
...

前言

上一篇安装好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表数据的导出(不详细介绍了)

未完待续!!!
!!!!!!
【hadoop】hive实操命令and基本命令介绍

相关标签: hadoop学习