(使用hive 2.3版本)
hive的资料
Hive 教程(官方Tutorial)
Hive HiveQL基础知识及常用语句总结
Hive2.0函数大全(中文版)
过往记忆的博客
表格的操作
创建表格
创建“课程”表格,用逗号分隔。
create table course(Cno int,Cname string)
row format delimited fields terminated by ','
stored as textfile;
写入数据
1.将本地文件 students.txt 中的内容加载到表 students 中。
load data local inpath '/home/hadoop/tmp/hive_test/students.txt' overwrite into table students;
2.可以把查询结果写入一张表。
INSERT OVERWRITE TABLE students
SELECT user.*
FROM user
3.也可以把查询结果放在hdfs系统中或者本地系统中。
INSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum'#pv_age_sum是文件夹,查询结果是该文件夹下的一个文件。
SELECT pv_users.age, count_distinct(pv_users.userid)
GROUP BY pv_users.age;#这是放在hdfs中的,在"DIRECTORY"前加上"LOCAL",就表示放在本地。
如果是存在本地,打开表示查询结果的那个文件,显示如下:
95001^A李勇^A男^A20^ACS
95002^A刘晨^A女^A19^AIS
95003^A王敏^A女^A22^AMA
95004^A张立^A男^A19^AIS
95005^A刘刚^A男^A18^AMA
查询
连接
join
:只显示左右两表匹配到的数据。(相当于mysql中的join)
left semi join
:只显示左表中的部分数据,并且这部分数据是符合匹配条件。(相当于对左表筛选)
left outer join, right outer join, full outer join
:这三个就是mysql中左连接、右连接和全连接。
示例:
SELECT u.*
FROM user u LEFT SEMI JOIN students s ON (s.userid = u.id)
聚合分组(Aggregations)
这和mysql中的分组类似:
如要统计数量,可以对相同的字段pv_users.userid 使用DISTINCT。
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
不能对不同的字段pv_users.userid, pv_users.ip使用DISTINCT,以下写法是不允许的。
但我测试时发现以下写法是没有报错的,不知道官网上为什么这样写?
INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;