第一二章、基本操作
1.set命令
会打印出命名空间,hivevar、hiveconf、system、env所有的变量。
还可以给变量附新的值。
2.Hive中‘一次使用命令’
将结果保存起来
[ffcs@nn71 bin]$ hive -S -e "select * from emp" > /home/ffcs/hive-0.13.0-bin/examples/files/mydata/copy_emp;
3.从文件中执行Hive查询
首先保存为具有.q或者.hql后缀名的文件
hive /home/ffcs/hive-0.13.0-bin/examples/files/mydata/hive_f_test.q(测试没有数据,可能是数据库选的不正确)
在Hive shell中可以使用source
source /home/ffcs/hive-0.13.0-bin/examples/files/mydata/hive_f_test.q;
4.如何显示字段
通过设置hiveconf配置项hive.cli.print.header为true来开启这个功能
set hive.cli.print.header=true;
第三章、数据类型和文件格式
1.timestamp
新增数据类型timestamp,可以是整数,距离Unix新纪元(1970年1月1日,午夜12点)的秒数,也可以是浮点数,秒数精确到纳秒(小数点后保留9位),还可以是字符串,即JDBC所约定的时间字符串格式,YYYY-MM-DD hh:mm:ss.fffffffff
2.三种集合数据类型
创建表
hive> create table employees(
> name string,
> salary float,
> subordinates array<string>,
> deductions map<string,float>,
> address struct<strate:string, city:string, state:string>
> )
> row format delimited
> fields terminated by ','
> collection items terminated by '*'
> map keys terminated by '$'
> stored as textfile;
元素之间的分隔符为’*’
键和值之间的分隔符为’$’
列之间的分隔符为’,’
第四章、数据定义
1.创建数据库
craete databsse mydb
2.通过正则表达式查询数据库
show database like ‘h.*’
3.修改数据库的存储位置
Create database mydb location ‘/home/ffcs/...’
4.显示数据库的目录
describe database mydb;
5.显示当前数据库
没有命令可以显示当前使用的数据库
可以通过设置属性来显示
hive> set hive.cli.print.current.db=true;
hive (mydb)> set hive.cli.print.current.db=false;
6.删除数据库
drop database mydb
7.查看表结构信息
describe extended emp;
8.查看所有分区
show partitions emp;
9.创建外部表
create external table if not exists ex_emp(
id string,
name string)
row format delimited fields terminated by ','
location '/home/ffcs/hive-0.13.0-bin/examples/files/mydata';(不能直接显示mydata文件下的文本)
10.表重命名
Alter table emp1 rename to emp2
11.创建分区
11增加分区
alter table t_p_employees add partition(country='China',state='lianhe');
12删除分区
ALTER TABLE page_view
DROP PARTITION (dt='2008-08-08', country='us');
第五章 HiveSQL数据操作
1.向管理表中加载数据
说明:
如果使用local关键字,这个路径是本地文件系统的路径,数据将会被拷贝到目标位置;如果省略local,这个路径是分布式文件系统中的路径,数据从这个路径转移到目标位置。数据加载
2.通过查询向表中插入数据
以覆盖的形式插入:
以追加的方式插入:
3.动态分区插入
说明:动态分区的默认功能是没有开启
可以通过命令查看
默认为严格,在这种模式下要求至少有一列分区是静态的。这样有助于阻止因设计错误导致查询产生大量的分区,错误使用时间戳作为分区。
修改为nostrict后可以动态分区
也可以动态静态分区混合,但静态分区键必须出现在动态分区键之前。
4.通过查询加载数据
ceate table e as select * from emp;
5.导出数据
insert overwrite local directory '/home/ffcs/hive-0.13.0-bin/examples/files/F_shifx1.txt'
> select * from emp;
第六章、HiveQL查询
1.数组查询方法
2.键值查询方法
3.结构体查询
4.表生成函数
explode()
返回0到多行结果,每行都对应输入的array数组中的一个元素
5.case when
6.连接查询
内连接
On子句指定了两个表之间的数据连接条件,where字句限制了左边表的是哪个记录,右边表是那个记录。
select p_emp.* from p_emp join p_emp2 on p_emp.a=p_emp2.a;
select * from emp join emp2 on emp.id=emp2.id;
默认将大表放在后面,以增加查询速度
select /*+streamtable(s)*/ emp.id,emp.name,emp2.name from emp join emp2 on emp.id=emp2.id;
Where子句在连接查询后才会执行
Left semi join(左半开连接,不支持右半开连接)
相当于in ,hive不支持in查询。
Select s.id,name from table_name s
Where s.id,s.name in(select d.id,d.name from dev d);(不支持)
Select s.id,s.name from table_name s left semi join dev d on s.id=d.id and s.name=d.name;
Map-side join将小表放入内存中
7.order by 和sort by的区别
Order by 是对所有的进行排序,而sort by 只对每个reducer中的数据进行排序,不能保证整体的顺序。
8.sort by 和 distribute by
Distribute by 控制map 的输出在reducer中是如何划分的。
9.Cluster by
将相同的数值分配到同一个桶中。
Select ... From ... Where ... Cluster by id;
10.抽样查询
3是代表被散列的桶的个数,10表示总共桶的个数
第七章、视图
第八章、模式设计
1.同一份数据多种处理
(需要两次扫描表)
insert overwrite table sales
select * from history where action = ‘purchased’;
select * from history where action = ‘returned’;
(只需一次扫描)
from history
insert overwrite sales select * where action = ‘purchased’;
insert overwrite sales select * where action = ‘returned’;
2.分桶表数据处理
create table ...
partitioned by ...
clustered by (user_id) into 96 buckets;
强制hive为目标表的分桶初始化设置一个正确的reducer个数
Set hive.enforce.bucketing = true
如果没有设置这个,则要自己设置和分桶个数相匹配的reducer个数。
例如
Set mapred.reduce.tasks=96,然后在insert 语句中,需要使用select 语句增加cluster by.
3.增加列
Alter table 表名 add columns (user_id string)
第十章、调优
1.执行的详细过程
查询前加explain
2.并行执行
设置参数
Hive.exec.parallel 为true
3.严格模式
通过设置属性
Hive.mapred.mode 的值为true可以禁止三种类型的查询
第一个:对于分区表,一定要有where筛选条件
第二个:对于order by 语句,一定要有limit
第三个:限制笛卡尔积的查询
第十三章、函数
1.查看函数
Show functions;
2.函数的简短介绍
desccribe function concat;
3.详细说明
describe function extended concat
4.表生成函数
Explore的错误使用(查询每个人的下属员工)
Select explore(subordinate) from employees
Hive提供一个lateral view
Select lateral view explore(subordinate) from employees;
5.自定义函数
一个自定义函数需要继承UDF类并实现evaluate()函数;
编写完成生成jar包,放入对应的路径下,创建函数,使用函数