DDL(Data Definition Language)数据定义
一、创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
注:Impala不支持WITH DBPROPERTIE…语法,但是在Hive中可以
[bigdata12:21000] > create database db_hive WITH DBPROPERTIES('name' = 'Plus');
Query: create database db_hive
WITH DBPROPERTIES('name' = 'ttt')
ERROR: AnalysisException: Syntax error in line 2:
WITH DBPROPERTIES('name' = 'ttt')
^
Encountered: WITH
Expected: COMMENT, LOCATION
hive> create database db_hive WITH DBPROPERTIES('name' = 'plus');
或者直接通过Impala创建:
[cdh2:21000] >create database db_hive ('name' = 'plus');
二、查询数据库
1.显示数据库
[cdh:21000] > show databases;
[cdh:21000] > show tables;
Query: show tables
+----------+
| name |
+----------+
| student2 |
+----------+
Fetched 1 row(s) in 0.07s
[bigdata12:21000] > show databases like 'hive*';
这里的like也可以不写。
Query: show databases like 'hive*'
+---------+---------+
| name | comment |
+---------+---------+
| hive_db | |
+---------+---------+
[bigdata12:21000] > desc database hive_db;
Query: describe database hive_db
+---------+----------+---------+
| name | location | comment |
+---------+----------+---------+
| hive_db | | |
+---------+----------+---------+
2.删除数据库
[bigdata12:21000] > drop database hive_db;
[bigdata12:21000] > drop database hive_db
注:Impala不支持alter database语法,且当数据库被 USE 语句选中时,无法删除
三、创建表
1.管理表-内部表
[bigdata12:21000] >create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student2';
[bigdata12:21000] > desc formatted student2;
2.外部表
[bigdata12:21000] >create external table stu_external(
id int, name string)
row format delimited fields terminated by '\t'
location '/stu_external'; 外部表可以自定义存储路径
这样这张表就不会在默认数据库中存储,存在自定义的路径下。
四、分区表
1.创建分区表
[bigdata12:21000] >create table stu_par(id int, name string)
partitioned by (month string)
row format delimited
fields terminated by '\t';
分区字段永远都在最后显示,像这里的month就是如此。
2.向表中导入数据
[bigdata12:21000] > alter table stu_par add partition (month='201910');
[bigdata12:21000] > load data inpath '/student.txt' into table stu_par partition(month='201910');
[bigdata12:21000] > insert into table stu_par partition (month = '201910') select * from student;
注意:
Impala:如果分区没有,load data导入数据时,不能自动创建分区。
Hive:如果分区没有,load data导入数据时,会自动创建分区。
在HDFS上load相当于移动、在Hive上load本地的话就相当于复制进去;HDFS的话相当于剪切。
接下来自己通过Impala将student表中的数据插入到stu_par表中的指定分区
走Hive的话需要运行job,需要走map
3.查询分区表中的数据
[bigdata12:21000] > select * from stu_par where month = '201911';
4.增加多个分区
[bigdata12:21000] > alter table stu_par add partition (month='201812') partition (month='201813');
增加多个分区的话分区之间要用空格隔开。
5.删除分区
[bigdata12:21000] > alter table stu_par drop partition (month='201812');
删除多个分区的话分区之间要用逗号隔开。
6.查看分区
[bigdata12:21000] > show partitions stu_par;
五、创建视图
#创建视图
create view
as
#展示视图
show tables;
#查询视图
select * from stu_view;
#更改视图
alter view stu_view as
#删除视图
drop view
六、Impala常用SQL
1.insert 语句
#创建表
create table
#插入数据
insert into person values(1,'A',18);
insert into person values(1,'A_1',20);
insert into person values(2,'B',29);
insert into person values(3,'C',16);
insert into person values(4,'D',40);
Impala执行每条insert语句通常只需要零点几秒,
2.ORDER BY 语句
order by age desc; 倒序的
注意:Impala不支持区内排序,只支持全局排序,因为Impala不走MR。
3.GROUP BY 语句
insert into person values(1,'A',21);
select name,sum(age) from person group by name;
对name进行分组,求每组的年龄和
4.Having 语句
select name,sum(age) from person
group by name having sum(age) >30;
对name进行分组,求每组的年龄和,并且只筛选出年龄和大于30的
5.Limit 语句
select * from person order by id limit
按照id排序,只选取前三行的数据
6.offset 语句
select * from person order by id limit 3 offset
Offset语句在Hive是没有的
7.union 语句
select * from stu_view union
UNION 操作符 合并两个或多个 SELECT 语句的结果。