hive 使用streaming 的map 脚本来处理数据

hive 使用streaming 的map 脚本来处理数据

在对hive 进行 select 查询的时候 我们可以编写 python 、php 、c++等脚本来进行相应的数据处理,我们要用到hive 的 TRANSFORM 和 using

看例子:

add file /www/FCCS_Data/ComETL/hive/sql_map/demo.py ;
from access_fccs select TRANSFORM (time) using 'python demo.py' where week=41 limit 10 ;

或者:

add file /www/FCCS_Data/ComETL/hive/sql_map/demo.py;
select TRANSFORM (time) using 'python demo.py' as (time) from (select * from access_fccs where week=41 limit 10) a ;

上面 SQL的意思是 将查询结果集中的 time 通过 demo.py 进行处理 返回相应的结果,至于都做什么处理了,请看下面的demo.py代码。

这里我们需要注意的是,一定要先 将map脚本添加到分布式缓存中,否则会报错 metadata.HiveException: [Error 20003]: An error occurred when trying to close the Operator running your custom script. at 这种错误

特别说明 这里的 路径为本地路径 不是分布式HDFS 路径,新手比较容易搞混

然后看看我们的demo.py 是怎么写的

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import datetime
import time

#把时间戳转成字符串形式
def timestamp_toString(stamp):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(stamp))

for line in sys.stdin:
print timestamp_toString(float(line))

董python 的朋友不难看出 这里是将我们的时间戳转化成日期格式输出

因此我们执行完毕 hive SQL 后 的结果为:

Total MapReduce CPU Time Spent: 23 seconds 880 msec
OK
2013-10-11 13:11:47
2013-10-11 13:11:47
2013-10-11 13:11:47
2013-10-11 13:11:47
2013-10-11 13:11:47
2013-10-11 13:11:48
2013-10-11 13:11:48
2013-10-11 13:11:48
2013-10-11 13:11:48
2013-10-11 13:11:48
Time taken: 33.411 seconds