Hive的基本操作
一、hive指令基本操作
清屏:Ctrl+L 或者 !clear
查看数据仓库中的表:show tables;
查看数据仓库中内置的函数:show functions;
查看表结构:desc 表名
查看HDFS上文件:dfs -ls
执行linux指令:!+指令
执行HQL语句:select
执行SQL的脚本:source SQL文件
二、hive的DDL操作、
a.分割符
create table jiametest(uid string,name string)row format delimited fields terminated by ',';
b.单分区
create table jiametest1(uid string,name string)partitioned by (country String)row format delimited fields terminated by ',';
LOAD DATA local INPATH 'path' INTO TABLE tablename partition(country='USA');
c.双分区
create table jiametest1(uid string,name string)partitioned by (sex String,hour String);
LOAD DATA local INPATH 'path' INTO TABLE tablename partition(sex='男',hour='01');
d.分桶
#指定开启分桶
set hive.enforce.bucketing = true;
set mapreduce.job.reduces = 4 ;
先创建 一个学生表
create table students(Sno int,Sname String,Sex String,Sage int, Sdept String)row format delimited fields terminated by ',';
导入数据
LOAD DATA local INPATH ' /home/linwentao/desktop/hivedata/students.txt' INTO TABLE students;
e.外部表
EXTERNAL 关键子可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)
Hive 创建内部表时,会将数据移动到数据仓库指向的路径,若创建外表表,仅仅记录数据所在的路径,不对数据的位置做任何改变,在删除表时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据
LIKE 允许用户复制现有的表结构,但是不复制数据
f.修改表
//一次添加一个分区
增加分区:ALTER TABLE tablename ADD PARTITION(dt='20170101')location 'path';
//一次添加多个个分区
ALTER TABLE tablename ADD PARTTITION(dt='2008-08-08',country='us')location
'path' PARTITION(dt='2008-08-09',country='us')location 'path';
删除分区
ALTER TABLE tablename DROP IF EXISTS PARTITION(dt='2008-08-08');
ALTER TABLE tablename DROP IF EXISTS PARTITION(dt='2008-08-08',country='us');
修改分区
ALTER TABLE tablename PARTITION(dt='2008-08-08')RENAME TO PARTITION(dt='20080808');
添加列
ALTER TABLE tablename ADD | REPLACE COLUMNS(col_name STRING);
修改列
test(a int,b int,c int);
//修改a 字段名
ALTER TABLE test CHANGE a a1 INT;
//修改a 的字段并且在b的后面
ALTER TBALE test CHANGE a a1 STRING AFTER b;
//修改b位置
ALTER TABLE test CHANGE b b1 INT FIRST;
// 表重命名
ALTER TABLE test RENAME TO new_test;
三 、hive的DML操作
3.1.Load
在将数据加载到表中时,hive不会进行任何转换。加载操作是将数据文件移动到与hive表对应的位置的纯复制、移动操作
语法结构
LOAD DATA [LOCAL] INPATH 'filename' [OVERWRITE] INTO TABLE table [PARTITION (partcol=val1,partcol2=val2...)]
说明:
a.filepath
相对路径,例如:project/datal
绝对路径, 例如:/user/hive/project/datal
完整UIR, 例如:hdfs://namenode:9000/user/hive/project/datal
filepath 可以引用一个文件(在这种情况下,hive将文件移动到表中)或者它可以一个目录(在这种情况下,hive将吧目录中的所有文件移动到表中)
b.LOCAL
如果指定了local,load命令将在本地文件系统中查找文件路径
load 命令会将filepath中的文件复制到目标文件系统中目标文件系统由表的位置性决定,被复制的数据文件移动到表的数据对应的位置。
如果没有指定LOCAL关键字,如果filepath指向的是一个完整的URI,hive会直接使用这个URI。否则:如果没有指定schama或者authority,hive会使用在hadoop配置文件定义的schama和authority,fs.default.name指定了namenode的url
c.OVERWRITE
如果使用overwrite关键字,则目标表(或者分区)中的内容会被删除,然后再将filepath指向文化/目录中的内容添加到表/分区
如果目标表已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所代替。
3.2.insert
hive中insert主要结合select查询语句使用,将查询结果插入到表中,例如:
insert overwrite table stu_buck select * from student cluster by(Sno);
需要保证查询结果列的数目和需要插入数据表格的列数目一致,如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但不能保证转换一定成功,转换失败的数据将会为null.
可以将一个表查询出来的数据插入原表中,结果相对于自我复制一份数据。
a.multo inserts 多重插入:
from source_table
insert overwrite table tablename1 [partition (partcol1=val1,partcol2=val2)]
select_statement1
insert overwirte table tablename2 [partition (partcol1=val1,partcol2=val2)]
select_statement2...
b.Dynamic partition inserts 动态分区插入:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1=[val1],partcol=[val2]...)
select_statement FROM from_statement
动态分区是通过位置来对应区值的。原始表select出发的值和输出partition的值的关系仅仅是通过位置来确定的和名字并没有关系。
c.导出表数据
INSERT OVERWRITE [LOCAL]DIRECTORY directory1 SELECT .. FROM ...
multiple inserts"
FROM from_statement
INSERT OVERWEITE [LOCAL]DIRECTORY directory1 select_statement1
[INSERT OVERWRITE[LOCAL]DIRECTORY directory2 select_statement2]..
3.3 select
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[HAVING having_condition]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number];