问题导读:
1.需要实现Hive中的函数无法实现的功能时,有什么解决办法?
2.Python如何实现获取顶级域名和过滤站内跳转?
在Hive中,需要实现Hive中的函数无法实现的功能时,就可以用Streaming来实现。其原理可以理解成:用HQL语句之外的语言,如Python、Shell来实现这些功能,同时配合HQL语句,以实现特殊的功能。
比如,我有一张不同网站访问的日志表,其中有两个列是url和ref,分别代表当前访问的网址和来源地址,我想要查看用户的来源,即看用户都是从那些网站跳到这些网站上去的,这里有些网站可能域名是二级甚至三级域名,但是这些实际上是属于其顶级域名的。所以要找出其顶级域名。这个在Hive的自定义函数中是无法实现的。所以采用Streaming的方式来实现。
准备表和数据
- --建表
- drop table if exists view_all;
- create table if not exists view_all(
- ad STRING,ua STRING,ip STRING,cookie STRING,url STRING,ref STRING,
- action STRING,value STRING,timestamp STRING)
- ROW FORMAT DELIMITED
- FIELDS TERMINATED BY '\t'
- STORED AS TEXTFILE;
- --导入日志数据
- load data local inpath 'view_all' overwrite into table view_all;
复制代码
Python实现获取顶级域名和过滤站内跳转- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- '''
- Created on 2014年8月6日
- @author: zhaohf
- '''
- import sys
- import urlparse
- import re
-
- topHostPostfix = (
- '.com',
- '.net',
- '.org',
- '.cn',
- '.com.cn'
- )
- #获取顶级域名
- def get_top_host(url):
- parts = urlparse.urlparse(url)
- host = parts.netloc
- extractPattern = r'[^\.]+('+'|'.join([h.replace('.',r'\.') for h in topHostPostfix])+')
- 调用python 脚本[/font][/color][/p][p=26, null, left][color=#333333][font=Arial][code]--排除站内跳转
- drop table if exists view_from;
- CREATE TABLE if not exists view_from like view_from;
-
- ADD FILE mapper.py;
- INSERT OVERWRITE TABLE view_from
- SELECT TRANSFORM(ad,ua,ip,cookie,url,ref,action,value,timestamp)
- USING 'python mapper.py'
- AS (ad,ua,ip,cookie,url,ref,action,value,timestamp)
- FROM view_all
- ;
- pattern = re.compile(extractPattern,re.IGNORECASE)
- m = pattern.search(host)
- return m.group() if m else host
复制代码
- #排除站内跳转
- if __name__ == '__main__':
- for line in sys.stdin:
- try:
- line = line.strip()
- li = line.split('\t')
- url = li[4]
- ref = li[5]
- url_top_host = get_top_host(url)
- ref_top_host = get_top_host(ref)
- if url_top_host != ref_top_host:
- li[4] = url_top_host
- li[5] = ref_top_host
- newline = ''
- for l in li:
- newline += '\t'+l
- print newline.strip()
- else:
- pass
- except Exception,err:
- continue
复制代码
调用python 脚本
- --排除站内跳转
- drop table if exists view_from;
- CREATE TABLE if not exists view_from like view_from;
-
- ADD FILE mapper.py;
- INSERT OVERWRITE TABLE view_from
- SELECT TRANSFORM(ad,ua,ip,cookie,url,ref,action,value,timestamp)
- USING 'python mapper.py'
- AS (ad,ua,ip,cookie,url,ref,action,value,timestamp)
- FROM view_all
- ;
复制代码
亦可以将hql语句保存成文件,使用hive -f query.hql 来调用。
其中需要注意细节,比如__main__被写成了 __mian__,好痛苦!
原文:Hive Python Streaming的原理及写法
|