beeline进入交互命令行
beeline -u jdbc:hive2://node01:10000 -n root
--查看数据库列表
show databases;
--使用数据库
use database_name;
--创建数据库
create database if not exists hive_db
comment 'hive database'--数据库注释
location 'hiveDB'--存放在HDFS的路径
with dbproperties ('create='MrTan'')--数据库额外属性 创建者
--查看数据库信息
desc hive_db;
--删除数据库
drop database if exists hive_db cascade;--cascade级联删除 如果数据库中存在表默认行为是 restrict会删除失败
内部表
create table user_in (
stuNo int ,
stuName string
)
row format delimited fields terminated by '\t';
外部表
create external table user_out(
stuNo int,
stuName string,
age int,
sex char(1)
)row format delimited fields terminated by "\t"--指定使用的分隔符
location "/hive/studentNo" --存放在hdfs上的位置
分区表
create external table user_partition(
userNo int,userName string
)
partitioned by(deptNo int)--根据部门字段分区 在查询数据的时候deptNo如果为1就到1的分区当中查找 如果为2就到2的分区中去查找数据
row format delimited fields terminated by '\t'
location '/hivedb/emp_partition';存储位置
分桶表
CREATE external TABLE user_bucket(
stuNo INT,stuName STRING)
clustered BY(stuNo) sorted BY (stuNo) INTO 4 buckets --根据学生编号分桶现在是分4个桶 对stuNo进行取模 也就是说stuNo /4 余数相同的会在一个文件 所以会产生4个文件
ROW FORMAT delimited FIELDS TERMINATED BY '\t'
location '/user_bucket';
分桶表&分区表
导入数据的时候需要指定分区
CREATE TABLE page_view_bucketed(
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING,
ip STRING )
PARTITIONED BY(dt STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
STORED AS SEQUENCEFILE;
倾斜表
create external table stu_skewed(
stuNo int,
stuName string
)
skewed by (stuNo)on(4,7,9)--设置倾泄值 设置的数据为严重倾斜,这些数据会单独成立一个文件,查询的时候直接从独立文件拉取值
row format delimited fields terminated by '\t'
location '/stu_skewed';
临时表
临时表仅对当前session可见,临时表的数据将暂时存储在用户的暂存目录中,并在会话结束后删除。如果临时表跟永久表名称相同,则对该表的任何引用都会解析成临时表。临时表不支持分区,不支持创建索引
create temoirary table stu_temp(
stuNo int,
stuName string
)row format delimited fields terminated by '\t';
复制表结构
create temporary external table if not exists stu_co like users;
加载本地数据文件到表中
load data local inpath "/usr/local/user.txt" into table users;--加载user文本文件到users表中
重命名表
alter table users rename to stu;--修改users表为stu
修改列
alter table stu users change stuNo No int;--修改列名
alter table stu change No stuNo int,after stuName--修改No名称为stuNo,并将放在stuName后面
--为字段增加注释
alter table stu change stuNo No int comment ‘学生编号’
清空表
truncate table users;>>目前只有内部表才可以执行truncate 外部表执行报错Cannot truncate non-managed table users.
删除表
drop table users if exists users;#内部表不仅删除表的数据,同时会删除HDFS上的数据,外部表删除的时候只会删除元数据,不会删除HDFS上的数据
sql插入数据
#插入数据可以使用sql插入
insert into table users values()
#更新语句
update users set No=12 where No=1
#删除数据
delete from users where No=11
查看表信息
#查看表
show tables
#查看数据库
show tables;
#查看创建视图或者表语句
show create table tableName/viewName
Hive高级查询
#MAPJOIN 用来标记小表,如果所有表只有一张是小表。Hive把这张小表加载到内存中
select /*+MAPJOIN(d)*/ from user
#STREAMTABLE 在多表进行联结的时候,
#如果每个 ON 字句都使用到共同的列(如下面的 b.key)
#,此时 Hive 会进行优化,将多表 JOIN 在同一个 map / reduce 作业上进行。
#同时假定查询的最后一个表(如下面的 c 表)是最大的一个表,
#在对每行记录进行 JOIN 操作时,
#它将尝试将其他的表缓存起来,然后扫描最后那个表进行计算。因此用户需要保证查询的表的#大小从左到右是依次增加的。
SELECT /*+ STREAMTABLE(d) */ e.*,d.*
FROM emp e JOIN dept d
ON e.deptno = d.deptno
WHERE job='CLERK';