1:数据库DDL操作

1:创建数据库

hive > create database db_hive;
# 或者
hive > create database if not exists db_hive;

数据库在HDFS上的默认存储路径是 /user/hive/warehouse/数据库名.db

2:显示所有数据库

hive> show databases;

3:查询数据库

hive> show databases like 'db_hive*';

4:查看数据库详情

hive> desc database db_hive;

        显示数据库详细信息

hive> desc database extended db_hive;

5:切换当前数据库

hive > use db_hive;

6:删除数据库

#删除为空的数据库
hive> drop database db_hive;

#如果删除的数据库不存在,最好采用if exists 判断数据库是否存在
hive> drop database if exists db_hive;

#如果数据库中有表存在,这里需要使用cascade强制删除数据库
hive> drop database if exists db_hive cascade;

2:表DDL操作

1:建表语法介绍

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 FORMAT row_format]  row format delimited fields terminated by “分隔符”
[STORED AS file_format] 
[LOCATION hdfs_path]

官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

  • 字段解释说明
  • CREATE TABLE 创建一个指定名字的表
  • EXTERNAL 创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),指定表的数据保存在哪里
  • COMMENT 为表和列添加注释
  • PARTITIONED BY 创建分区表
  • CLUSTERED BY 创建分桶表
  • SORTED BY 按照字段排序(一般不常用)
  • ROW FORMAT 指定每一行中字段的分隔符
  • row format delimited fields terminated by ‘\t’
  • STORED AS 指定存储文件类型
  • 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、ORCFILE(列式存储格式文件)
  • 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE
  • LOCATION 指定表在HDFS上的存储位置。

2:创建内部表

1:使用标准的建表语句

use myhive;
create table stu(id int, name string);

可以通过insert into向hive表当中插入数据,但是不建议工作当中这么做;因为每个insert语句转换成mr后会生成一个文件
insert into stu(id,name) values(1,"zhangsan");
insert into stu(id,name) values(2,"lisi");

select * from  stu;

2:查询建表法

通过AS 查询语句完成建表:将子查询的结果存入新表里

create table if not exists myhive.stu1 as select id, name from stu;

表中有数据
select * from stu1;

3:like建表法

根据已经存在的表结构创建表

create table if not exists myhive.stu2 like stu;

表中没有数据
select * from stu2;

4:查询表的类型

hive > desc formatted myhive.stu;

hive查看当前role hive查看当前处于哪个库_数据仓库

hql示例:创建内部表并指定字段之间的分隔符,指定文件的存储格式,以及数据存放的位置

create table if not exists myhive.stu3(id int, name string)
row format delimited fields terminated by '\t' 
stored as textfile 
location '/user/stu3';

3:创建外部表

  1:外部表因为是指定其他的hdfs路径的数据加载到表当中来

        所以hive表会认为自己不完全独占这份数据,所以删除hive表的时候,数据仍然存放在hdfs当中,不会删掉

create external table myhive.teacher (t_id string, t_name string) 
row format delimited fields terminated by '\t';

2:创建外部表的时候需要加上==external== 关键字

        location字段可以指定,也可以不指定

        指定就是数据存放的具体目录

        不指定就是使用默认目录 ==/user/hive/warehouse==

hive查看当前role hive查看当前处于哪个库_hive_02

3:向外部表当中加载数据:

        我们前面已经看到过通过insert的方式向内部表当中插入数据,外部表也可以通过insert的方式进行插入数据,只不过insert的方式,我们一般都不推荐

        实际工作当中我们都是使用load的方式来加载数据到内部表或者外部表

        load数据可以从本地文件系统加载或者也可以从hdfs上面的数据进行加载

        ①从本地文件系统加载数据到teacher表当中去,==将我们附件当汇总的数据资料都上传到node03服务器的/kkb/install/hivedatas路径下面去

mkdir -p /kkb/install/hivedatas

        ②将数据都上传到/kkb/install/hivedatas路径下

        然后在hive客户端下执行以下操作

load data local inpath '/kkb/install/hivedatas/teacher.csv' into table myhive.teacher;

        ③从hdfs上面加载文件到teacher表里面去(将teacher.csv文件上传到==hdfs的/kkb/hdfsload/hivedatas==路径下)

cd /kkb/install/hivedatas
hdfs dfs -mkdir -p /kkb/hdfsload/hivedatas
hdfs dfs -put teacher.csv /kkb/hdfsload/hivedatas
# 在hive的客户端当中执行
load data inpath '/kkb/hdfsload/hivedatas' overwrite into table myhive.teacher;

4:内部表与外部表的互相转换

1:内部表转换为外部表

#将stu内部表改为外部表

alter table stu set tblproperties('EXTERNAL'='TRUE');

2:外部表转换为内部表

#把teacher外部表改为内部表

alter table teacher set tblproperties('EXTERNAL'='FALSE');

5:内部表与外部表的区别

①建表语法的区别

外部表在创建的时候需要加上==external==关键字

②删除表之后的区别

内部表删除后,表的元数据和真实数据都被删除了

外部表删除后,仅仅只是把该表的元数据删除了,真实数据还在,后期还是可以恢复出来