多维统计一般分两种,我们看看 Hive 中如何解决:
1、同属性的多维组合统计
(1)问题:
有如下数据,字段内容分别为:url, catePath0, catePath1, catePath2, unitparams
https://cwiki.apache.org/confluence 0 1 8 {"store":{"fruit":[{"weight":1,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://my.oschina.net/leejun2005/blog/83058 0 1 23 {"store":{"fruit":[{"weight":1,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://www.hao123.com/indexnt.html?sto 0 1 25 {"store":{"fruit":[{"weight":1,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
https://cwiki.apache.org/confluence 0 5 18 {"store":{"fruit":[{"weight":5,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://my.oschina.net/leejun2005/blog/83058 0 5 118 {"store":{"fruit":[{"weight":5,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://www.hao123.com/indexnt.html?sto 0 3 98 {"store":{"fruit":[{"weight":3,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://www.hao123.com/indexnt.html?sto 0 3 8 {"store":{"fruit":[{"weight":3,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://my.oschina.net/leejun2005/blog/83058 0 5 81 {"store":{"fruit":[{"weight":5,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
http://www.hao123.com/indexnt.html?sto 0 9 8 {"store":{"fruit":[{"weight":9,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}
(2)需求:
计算 catePath0, catePath1, catePath2 这三种维度组合下,各个 url 对应的 pv、uv,如:
0 1 23 1 1
0 1 25 1 1
0 1 8 1 1
0 1 ALL 3 3
0 3 8 1 1
0 3 98 1 1
0 3 ALL 2 1
0 5 118 1 1
0 5 18 1 1
0 5 81 1 1
0 5 ALL 3 2
0 ALL ALL 8 3
ALL ALL ALL 8 3
(3)解决思路:
hive 中同属性多维统计问题通常用 union all 组合出各种维度然后 group by 进行求解:
01 |
create EXTERNAL table IF NOT EXISTS t_log (
|
02 |
url string, c0 string, c1 string, c2 string, unitparams string
|
03 |
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/tmp/decli/1' ;
|
06 |
select host, c0, c1, c2 from t_log t0
|
07 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
08 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
10 |
select host, c0, c1, 'ALL' c2 from t_log t0
|
11 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
12 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
14 |
select host, c0, 'ALL' c1, 'ALL' c2 from t_log t0
|
15 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
16 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
18 |
select host, 'ALL' c0, 'ALL' c1, 'ALL' c2 from t_log t0
|
19 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
20 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
23 |
select c0, c1, c2, count (host) PV, count ( distinct (host)) UV from (
|
24 |
select host, c0, c1, c2 from t_log t0
|
25 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
26 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
28 |
select host, c0, c1, 'ALL' c2 from t_log t0
|
29 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
30 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
32 |
select host, c0, 'ALL' c1, 'ALL' c2 from t_log t0
|
33 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
34 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
36 |
select host, 'ALL' c0, 'ALL' c1, 'ALL' c2 from t_log t0
|
37 |
LATERAL VIEW parse_url_tuple(url, 'HOST' ) t1 as host
|
38 |
where get_json_object(t0.unitparams, '$.store.fruit[0].weight' ) != 9
|
39 |
) test group by c0, c1, c2;
|
2、不同属性的多维组合统计
这种场景下我们一般选择 Multi Table/File Inserts,下面选自《programming hive》P124
Making Multiple Passes over the Same Data
Hive has a special syntax for producing multiple aggregations from a single pass
through a source of data, rather than rescanning it for each aggregation. This change
can save considerable processing time for large input data sets. We discussed the details
previously in Chapter 5.
For example, each of the following two queries creates a table from the same source
table, history:
hive> INSERT OVERWRITE TABLE sales
> SELECT * FROM history WHERE action='purchased';
hive> INSERT OVERWRITE TABLE credits
> SELECT * FROM history WHERE action='returned';
This syntax is correct, but inefficient. The following rewrite achieves the same thing,
but using a single pass through the source history table:
hive> FROM history
> INSERT OVERWRITE sales SELECT * WHERE action='purchased'
> INSERT OVERWRITE credits SELECT * WHERE action='returned';
2 |
INSERT OVERWRITE TABLE pv_gender_sum
|
3 |
SELECT pv_users.gender, count_distinct(pv_users.userid)
|
4 |
GROUP BY pv_users.gender
|
6 |
INSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum'
|
7 |
SELECT pv_users.age, count_distinct(pv_users.userid)
|
https://cwiki.apache.org/confluence/display/Hive/Tutorial
注意事项以及一些小技巧:
1、hive union all 的用法:不支持 top level,以及各个select字段名称、属性必须严格一致
2、结果的顺序问题,可以自己加字符控制排序
3、多重insert和union all一样也只扫描一次,但因为要insert到多个分区,所以做了很多其他的事情,导致消耗的时间非常长,其会产生多个job,union all 本身只有一个job
关于 insert overwrite 产生多 job 并行执行的问题:
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
http://superlxw1234.iteye.com/blog/1703713
4、当前HIVE 不支持 not in 中包含查询子句的语法,形如如下的HQ语句是不被支持的:
查询在key字段在a表中,但不在b表中的数据
select a.key from a where key not in(select key from b) 该语句在hive中不支持
可以通过left outer join进行查询,(假设B表中包含另外的一个字段 key1
select a.key from a left outer join b on a.key=b.key where b.key1 is null
5、left out join 不能连续3个以上使用,必须2个一组,2个一组包装起来使用。
01 |
select p.ssi,p.pv,p.uv,p.nuv,p.visits, '2012-06-19 17:00:00' from (
|
03 |
select * from ( select ssi, count (1) pv, sum (visits) visits from FactClickAnalysis
|
04 |
where logTime <= '2012-06-19 18:00:00' and logTime >= '2012-06-19 17:00:00' group by ssi ) p1
|
07 |
select ssi, count (1) uv from ( select ssi,cookieid from FactClickAnalysis
|
08 |
where logTime <= '2012-06-19 18:00:00' and logTime >= '2012-06-19 17:00:00' group by ssi,cookieid ) t1 group by ssi
|
13 |
select ssi, count (1) nuv from FactClickAnalysis
|
14 |
where logTime = insertTime and logTime <= '2012-06-19 18:00:00' and logTime >= '2012-06-19 17:00:00' group by ssi
|
6、hive本地执行mr
http://superlxw1234.iteye.com/blog/1703546
7、hive动态分区创建过多遇到的一个错误
http://superlxw1234.iteye.com/blog/1677938
8、hive中巧用正则表达式的贪婪匹配
http://superlxw1234.iteye.com/blog/1751216
9、hive匹配全中文字段
用java中匹配中文的正则即可:
name rlike '^[\\u4e00-\\u9fa5]+$'
判断一个字段是否全数字:
select mobile from woa_login_log_his where pt = '2012-01-10' and mobile rlike '^\\d+$' limit 50;
10、hive中使用sql window函数 LAG/LEAD/FIRST/LAST
http://superlxw1234.iteye.com/blog/1600323
http://www.shaoqun.com/a/18839.aspx
11、hive优化之------控制hive任务中的map数和reduce数
http://superlxw1234.iteye.com/blog/1582880
12、hive中转义$等特殊字符
http://superlxw1234.iteye.com/blog/1568739
13、日期处理:
查看N天前的日期:
select from_unixtime(unix_timestamp('20111102','yyyyMMdd') - N*86400,'yyyyMMdd') from t_lxw_test1 limit 1;
获取两个日期之间的天数/秒数/分钟数等等:
select ( unix_timestamp('2011-11-02','yyyy-MM-dd')-unix_timestamp('2011-11-01','yyyy-MM-dd') ) / 86400 from t_lxw_test limit 1;
14、删除 Hive 临时文件 hive.exec.scratchdir
http://hi.baidu.com/youziguo/item/1dd7e6315dcc0f28b2c0c576
REF:
http://superlxw1234.iteye.com/blog/1536440
http://liubingwwww.blog.163.com/blog/static/3048510720125201749323/
http://blog.csdn.net/azhao_dn/article/details/6921429
http://superlxw1234.iteye.com/category/228899
相关推荐
利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件+代码+讲义+工具软件),具体内容包括: 01_自动批量加载数据到hive 02_Hive表批量加载数据的脚本实现(一) 03_Hive表批量加载数据的脚本实现(二) ...
hive在数据分析的作用研究
包含video user数据
Hive原理/Hive SQL/Hive 函数/数据仓库分层和建模/Hive sql优化/数据倾斜
Hive学习总结及应用.pdf
基于hive旅游数据的分析与应用 PPT.pptx
springboot基于hive旅游数据的分析与应用.docx
由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive ...数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。
这是我的一份课程作业,需要事先下载搜狗日志文件。有问题,可以问百度。里面也参考了其他博客主的文章,在最后有相关链接。
大数据技术基础实验报告-Hive安装配置与应用
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询...
数据分析系统Hive
开源数据仓库Hive在facebook的应用
讲解hadoop生态,mapreduce原理,hive应用架构,数据过滤实战
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询...
临时文件链接
hive hive hive hive hive hive hive hive hive hive hive hive
hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询...
hadoop-hive的hql知识点详细总结,纯干货,建表,分区,分桶,hive的dml语句,hive的函数,hive的序列化与反序列化
(3)sqoop数据迁移,完成HIve与MySQL数据库中的数据交互 (4)Echarts搭建动态可视化大屏 (5)SpringBoot搭建可视化后台系统,完成前端与后台的数据传递与交互。 (6)基于Cenots7 搭建虚拟机,配置Hadoop、HDFS、...