在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])+')$'
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的原理及写法的更多相关文章

  1. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  2. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  3. python解释执行原理(转载)

    Python解释执行原理 转自:http://l62s.iteye.com/blog/1481421 这里的解释执行是相对于编译执行而言的.我们都知道,使用C/C++之类的编译性语言编写的程序,是需要 ...

  4. [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子

    [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子$ cat customers.txt 1 Ali us 2 Bsb ca 3 Carls mx $ hive h ...

  5. Spark 以及 spark streaming 核心原理及实践

    收录待用,修改转载已取得腾讯云授权 作者 | 蒋专 蒋专,现CDG事业群社交与效果广告部微信广告中心业务逻辑组员工,负责广告系统后台开发,2012年上海同济大学软件学院本科毕业,曾在百度凤巢工作三年, ...

  6. python虚拟机运行原理

    近期为了面试想要了解下python的运行原理方面的东西,奈何关于python没有找到一本类似于深入理解Java虚拟机方面的书籍,找到了一本<python源码剖析>电子书,但是觉得相对来说最 ...

  7. python程序执行原理

    Python程序的执行原理 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后解释器一条一条执行字节码指令,从而完成程序的执行. 1.1python先把代码(.py ...

  8. Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化

    Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化 一丶索引原理 什么是索引:       索引 ...

  9. Spark Streaming的原理

    Spark Streaming应用也是Spark应用,Spark Streaming生成的DStream最终也是会转化成RDD,然后进行RDD的计算,所以Spark Streaming最终的计算是RD ...

随机推荐

  1. [HihoCoder1596]Beautiful Sequence

    题目大意: \(n(n\le60)\)个数\(A_{1\sim n}\),将这些数随机打乱,问最后构成的数列满足对于所有的\(2\le i\le n-1\),都有\(2A_i\le A_{i-1}+A ...

  2. hdoj 5119 Happy Matt Friends 背包DP

    Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others ...

  3. PostgreSQL控制台以竖行显示

    \x select * from user; 这个和MySQL的有点区别,在查询之前使用\x进行显示的开启 注意:只需要用一次即可,以后的查询都是以竖行进行显示.

  4. 通过adb把apk安装到系统分区

    通过adb把apk安装到系统分区 以谷歌拼音为例:GooglePinyin1.4.2.apk提取出so文件libjni_googlepinyinime_4.solibjni_googlepinyini ...

  5. java 实现输出姓和名

    package xiaojie; import java.util.Scanner; public class baiJiaXing { public static void main(String[ ...

  6. redhat server 5.3内核升极2.6.18 升级到 3.5 装systemtap 原创

    1. 在 LINUX 3.5源代码目录下执行  yum install ncurses-devel     make menuconfig 2  打开内核跟踪事件,用于SYSTEMTAP跟踪 kern ...

  7. 报错:405 Method Not Allowed

    出现错误的原因是:静态文件不能通过post方式访问. 解决办法:改成用get方式访问.

  8. 如何搭建 LNMP环境

    和LAMP不同的是LNMP中的N指的是是Nginx(类似于Apache的一种web服务软件)其他都一样.目前这种环境应用的也是非常之多. Nginx设计的初衷是提供一种快速高效多并发的web服务软件. ...

  9. coursera课程Text Retrieval and Search Engines之Week 4 Overview

    Week 4 OverviewHelp Center Week 4 On this page: Instructional Activities Time Goals and Objectives K ...

  10. GNU GRUB

    Introduction GNU GRUB is a Multiboot boot loader. It was derived from GRUB, the GRand Unified Bootlo ...