hive的Query和Insert,Group by,Aggregations(聚合)操作
1、Query
(1)分区查询
在查询的过程中,采用那个分区来查询是通过系统自动的决定,但是必须是在分区列上基于where子查询。
SELECT page_views.*
FROM page_viewsWHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31' AND page_views.referrer_url like '%xyz.com';(2)、join 从集合的角度上来理解
在mysql中join的查询分为两类:(1)内联结查询 (2)外联结查询;hive当然也是有两种join的查询,并且其join的查询方式跟mysql相当的类似。下面通过案例详细介绍
首先创建两个表,并插入几天记录来作为测试:
create table jn1 (name String);
insert into table jn1 values("java1","java2","blue");
create table jn2 (name String);
insert into table jn2 values("mysql1"),("mysql2"),("blue");
1)内联结查询 (可以理解为求两个表的交集)
select jn1.*,jn2.* from jn1 JOIN jn2 ON(jn1.name=jn2.name)
所得结果是:
2)外联结查询
外联结查询与可以分为三种查询方式:1)左外连接, 2)右外连接,3) 全外联结查询
同样采用上面的两个表来进行测试。
i)左外连接查询 (可以理解成表a以及表a和表b的交集的集合)
select jn1.* ,jn2.* from jn1 LEFT JOIN jn2 ON(jn1.name=jn2.name);
或者
select a.* ,b.* from jn1 a LEFT JOIN jn2 b ON(a.name=b.name);
ii)右外连接查询(可以理解成表b以及表a和表b的交集的集合)
select jn1.* ,jn2.* from jn1 RIGHT JOIN jn2 ON(jn1.name=jn2.name);
或者
select a.* ,b.* from jn1 a RIGHT JOIN jn2 b ON(a.name=b.name);
iii)全外联结查询(表a和表b的并集)
select jn1.* ,jn2.* from jn1 FULL JOIN jn2 ON(jn1.name=jn2.name);
或者
select a.* ,b.* from jn1 a FULL JOIN jn2 b ON(a.name=b.name);
2、Group by 的查询
为了统计每一个性别不同用户的总数的查询语句可以是:
SELECT pv_users.gender, count (DISTINCT pv_users.userid) FROM pv_users GROUP BY pv_users.gender;
3、聚合计算
(1)单个聚合情况
SELECT pv_users.gender, count (DISTINCT pv_users.userid) FROM pv_users GROUP BY pv_users.gender;
(2)多个聚合可以同时计算,但是必须要有不同的列名
Multiple aggregations can be done at the same time, however, no two aggregations can have different DISTINCT columns .e.g while the following is possible
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;
如下面的多个聚合就不行:
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) //这两个查询之后列名重复,所以不允许
FROM pv_usersGROUP BY pv_users.gender;4、Insert
(1)将数据插入到hive中的表中
FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count_distinct(pv_users.userid)
GROUP BY pv_users.gender
(2)将数据插入到hdfs中的文件中
INSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum'
SELECT pv_users.age, count_distinct(pv_users.userid)
GROUP BY pv_users.age;
(3)动态分区插入
我们可以实现分区插入如下实现。
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='US') SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'US'INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='CA') SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'CA'INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='UK') SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'UK';以上实现的分区插入,存在一个问题:当增加某个国家时,那么需要在增加一个insert的语句,这样极其的不方便,为此hive提供了一个动态确定分区的方式来实现动态分区插入,只需要一条语句即可:
FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country) SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.country(4)插入数据到本地文件中
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/pv_gender_sum' SELECT pv_gender_sum.* FROM pv_gender_sum;
5、Union (连接)
它的意思是将两次或者多次的查询结果连接起来(但是它没有去重的功能)
select * from jn1 union all select * from jn2;
结果如下:
hive的Query和Insert,Group by,Aggregations(聚合)操作的更多相关文章
- [Hive - LanguageManual] DML: Load, Insert, Update, Delete
LanguageManual DML Hive Data Manipulation Language Hive Data Manipulation Language Loading files int ...
- hive的高级查询(group by、 order by、 join 、 distribute by、sort by、 clusrer by、 union all等)
查询操作 group by. order by. join . distribute by. sort by. clusrer by. union all 底层的实现 mapreduce 常见的聚合操 ...
- REP-20147 Cannot implement column link for this detail SQL query. Converting to group link.
注:本文为原创,作为学习交流使用,转载请标明作者及出处,作者保留追究法律责任的权力. Lumen Su lzsu1989#gmail.com (#=@) www.cnblogs.com/lzsu198 ...
- Hive 基本语法操练(一):表操作
Hive 和 Mysql 的表操作语句类似,如果熟悉 Mysql,学习Hive 的表操作就非常容易了,下面对 Hive 的表操作进行深入讲解. **(1)先来创建一个表名为student的内部表** ...
- elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
分析 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中的GROUP BY但是功能更强大. 举个例子,让我们找到所有职员中最大 ...
- mongdb group聚合操作
1.数据准备 [{"goods_id":1,"cat_id":4,"goods_name":"KD876"," ...
- hive常用函数 wordCount--Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战
第三天笔记 第三天笔记 SQL练习Hive 常用函数关系运算数值计算条件函数日期函数重点!!!字符串函数Hive 中的wordCount1.1 Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战 ...
- Mybatis之执行insert、update和delete操作时自动提交
单独使用Mybaits,而没有集成Spring的话,执行insert.update和delete操作是不会自动提交的,即执行语句后不会在数据库有对应的数据变化. 解决这样的方法就是打开自动提交开关,在 ...
- 关于GROUP BY和聚合函数
可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...
随机推荐
- Linux内核链表深度分析【转】
本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646 链表简介: 链表是一种常用的数据结构,它通过指针将一系列数据节点连 ...
- awk改变了OFS,$0却没变化
一个文件1.txt,内容如下 a b c d e 目的把列变行,输出为: a b c d e 脚本如下: awk 'BEGIN{RS="";FS="\n";OF ...
- [转] GitHub上README.md教程
点击阅读原文 最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编写README文件的同学们. README文件后缀名为md.md是markdown的缩写,markdown是一种 ...
- Android first---常见布局
###绝对布局AbsoluteLayout * android:layout_x="120dp" 在水平方向上偏移120像素 * android:layout_y ...
- Linux休眠,挂起,待机,关机的区别及相关命令
休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作.当再次使用时需按开关机键,机器将会恢复到您的执行休眠时的状态,而不用再次执行启动操作系统复杂的过程. 待机(挂起)是将当前处 ...
- System.Security.Cryptography.CryptographicException 出现了内部错误
调试微信支付退款时,需要使用pfx证书,在本地调试时没有问题,但在服务器部署时报异常:System.Security.Cryptography.CryptographicException 出现了内部 ...
- C++11带来的优雅语法
C++11带来的优雅语法 自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作; auto是在编译时对变量进行了 ...
- 线程池ExecutorService和完成服务CompletionService的使用获取线程的返回结果
package com.suning.ecif.admin.app.impl.temp; import java.util.ArrayList;import java.util.Collection; ...
- windows服务相关
1. 卸载服务 cmd 命令: sc delete + 服务名 2. 注册服务 cmd 命令 : 服务名+ install 3.mysql 启动服务步骤 1) 初始化密码:mysqld -initi ...
- 经典SQL语句大全以及50个常用的sql语句
经典SQL语句大全 一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql serv ...