立即注册 登录
About云-梭伦科技 返回首页

howtodown的个人空间 https://aboutyun.com/?19 [收藏] [复制] [分享] [RSS]

日志

Hive使用临时表及非临时表示例

已有 4848 次阅读2014-12-19 19:39

不创建表使用临时表

先看一下示例吧。
有这样一些日志,记录了url的一些信息。我现在需要统计出这些url中包含了-xianlu,或者-ziyouxing等的
出发到达城市的信息,并根据这个信息进行groupby来找出该线路被访问的次数。
http://test1.anyoneking.com/beijing-tianjin-xianlu.html
http://test1.anyoneking.com/beijing-badaling-xianlu.html
http://test1.anyoneking.com/beijing-tianjin-ziyouxing.html

http://test1.anyoneking.com/about.html

http://test1.anyoneking.com/link.html

http://test1.anyoneking.com/ab-c-link.html

这样,我们可以看一下,如果要针对-xianlu进行统计
我期望得到的结果是:
beijing-tianjin 1
beijing-badaling 1
beijing-tianjin 1

针对-xianlu进行处理
SELECT SUBSTRING(url,29, instr(url,'-xianlu')-29) AS url ,COUNT(*) AS pv
FROM tmp.pvlogWHERE instr(url,'-xianlu')>0GROUP BY SUBSTRING(url,29, instr(url,'-xianlu')-29)针对-ziyouxingSELECT SUBSTRING(url,29, instr(url,'-ziyouxing')-29) AS url ,COUNT(*) AS pvFROM tmp.pvlogWHERE instr(url,'-ziyouxing')>0GROUP BY SUBSTRING(url,29, instr(url,'-ziyouxing')-29)
我需要对这2个sql进行union all的操作。但是其实2个sql都很相似。

我们可以通过类似于临时表的方式来实现。

临时表

主要靠 Lateral View来实现。
用于UDTF(user-defined table generating functions)中将行转成列,例如
explode().
这样我们可以通过以下方式来实现临时表:
lateral view explode(split(‘-xianlu:-ziyouxing’,':’)) t as charidx
这样,我们就可以将原有的sql进行特殊处理,来简化逻辑,同时减少了对pvlog表的反复遍历,
因为在上面的处理方式中,如果有2种类型是可以的,如果类型越来越多,我们将面临资源的重复
调度。

SELECT SUBSTRING(p.url,29, instr(p.url,t.charidx)-29),COUNT(1)FROM labrador.pvlog p lateral VIEW explode(split('-xianlu:-ziyouxing',':')) t AS charidxWHERE instr(p.url,t.charidx)>0GROUP BY SUBSTRING(p.url,29, instr(p.url,t.charidx)-29)
这样的方式,只是减少了对大表的重复遍历。
当然了,我们也可以通过在
hive中创建一个表,来进行相同的操作,但是实际是没有必要的。
面对不同的问题选择不同的方式。

总结:通过小技巧进行行列转换,将原表扩展为2倍,通过一个HiveQL实现原来两次查询的结果。


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条