分享

Hive Python Streaming的原理及写法

laozhao0 发表于 2014-8-31 14:57:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 12678
问题导读:
1.需要实现Hive中的函数无法实现的功能时,有什么解决办法?
2.Python如何实现获取顶级域名和过滤站内跳转?









在Hive中,需要实现Hive中的函数无法实现的功能时,就可以用Streaming来实现。其原理可以理解成:用HQL语句之外的语言,如Python、Shell来实现这些功能,同时配合HQL语句,以实现特殊的功能。

比如,我有一张不同网站访问的日志表,其中有两个列是url和ref,分别代表当前访问的网址和来源地址,我想要查看用户的来源,即看用户都是从那些网站跳到这些网站上去的,这里有些网站可能域名是二级甚至三级域名,但是这些实际上是属于其顶级域名的。所以要找出其顶级域名。这个在Hive的自定义函数中是无法实现的。所以采用Streaming的方式来实现。

准备表和数据

  1. --建表  
  2. drop table if exists view_all;  
  3. create table if not exists view_all(  
  4. ad STRING,ua STRING,ip STRING,cookie STRING,url STRING,ref STRING,  
  5. action STRING,value STRING,timestamp STRING)  
  6. ROW FORMAT DELIMITED  
  7. FIELDS TERMINATED BY '\t'  
  8. STORED AS TEXTFILE;  
  9. --导入日志数据  
  10. load data local inpath 'view_all' overwrite into table view_all;  
复制代码

Python实现获取顶级域名和过滤站内跳转
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. '''
  4. Created on 2014年8月6日
  5. @author: zhaohf
  6. '''
  7. import sys
  8. import urlparse
  9. import re
  10. topHostPostfix = (
  11.     '.com',
  12.     '.net',
  13.     '.org',
  14.     '.cn',
  15.     '.com.cn'
  16. )
  17. #获取顶级域名
  18. def get_top_host(url):
  19.     parts = urlparse.urlparse(url)
  20.     host = parts.netloc
  21.     extractPattern = r'[^\.]+('+'|'.join([h.replace('.',r'\.') for h in topHostPostfix])+')
  22. 调用python 脚本[/font][/color][/p][p=26, null, left][color=#333333][font=Arial][code]--排除站内跳转
  23. drop table if exists view_from;
  24. CREATE TABLE if not exists view_from like view_from;
  25. ADD FILE mapper.py;
  26. INSERT OVERWRITE TABLE view_from
  27. SELECT TRANSFORM(ad,ua,ip,cookie,url,ref,action,value,timestamp)
  28. USING 'python mapper.py'
  29. AS (ad,ua,ip,cookie,url,ref,action,value,timestamp)
  30. FROM view_all
  31. ;
  32.   pattern = re.compile(extractPattern,re.IGNORECASE)
  33.     m = pattern.search(host)
  34.     return m.group() if m else host
复制代码

  1. #排除站内跳转
  2. if __name__ == '__main__':
  3.     for line in sys.stdin:
  4.         try:
  5.             line = line.strip()
  6.             li = line.split('\t')
  7.             url = li[4]
  8.             ref = li[5]
  9.             url_top_host = get_top_host(url)
  10.             ref_top_host = get_top_host(ref)
  11.             if url_top_host != ref_top_host:
  12.                 li[4] = url_top_host
  13.                 li[5] = ref_top_host
  14.                 newline = ''
  15.                 for l in li:
  16.                     newline += '\t'+l
  17.                 print newline.strip()
  18.             else:
  19.                 pass
  20.         except Exception,err:
  21.             continue
复制代码


调用python 脚本

  1. --排除站内跳转
  2. drop table if exists view_from;
  3. CREATE TABLE if not exists view_from like view_from;
  4. ADD FILE mapper.py;
  5. INSERT OVERWRITE TABLE view_from
  6. SELECT TRANSFORM(ad,ua,ip,cookie,url,ref,action,value,timestamp)
  7. USING 'python mapper.py'
  8. AS (ad,ua,ip,cookie,url,ref,action,value,timestamp)
  9. FROM view_all
  10. ;
复制代码

亦可以将hql语句保存成文件,使用hive -f query.hql 来调用。
其中需要注意细节,比如__main__被写成了 __mian__,好痛苦!




原文:Hive Python Streaming的原理及写法

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条