hive语句嵌入python脚本(进行map和reduce,实现左外连接)
在Hive语句中使用脚本(如python和shell)进行map和reduce:利用命令transform(或者指定map和reduce),配合加入的脚本文件add file
请看:http://www.coder4.com/archives/4052
别名后面as省略也行,空格直接加,如: table app_stats t1, app_data t2;
先举一个小例子:
add file ${python_script_path}/lanch_interval_count.py;
drop table temp_lanch_interval2;
create table temp_lanch_interval2 as
select reportdate, appid,channelname, app_version, deviceid,ts,sameday
from
(
from
(
from
(
select fl.reportdate, fl.appid, 1 as app_version,fn.channelname,fl.deviceid,fl.linux_time
from (select reportdate, appid, app_version,deviceid,linux_time from factloglanch WHERE dt>= ? and dt<= ? ) fl
left outer join factnewuser_nodimid fn on (fl.deviceid = fn.deviceid and fl.appid = fn.appid)
) a
map reportdate, appid, channelname,app_version, deviceid,linux_time using '/bin/cat'
as reportdate, appid, channelname,app_version, deviceid,linux_time
cluster by appid, channelname,deviceid
) b
reduce reportdate, appid, channelname,app_version, deviceid,linux_time using 'lanch_interval_count.py'
as reportdate, appid,app_version, channelname,deviceid,ts,sameday
) c
具体说明,引一篇讲的很好的博客:http://www.coder4.com/archives/4052
Hive中的TRANSFORM:使用脚本完成Map/Reduce
hive> select * from test;
OK
1 3
2 2
3 1
要输出每一列的md5值,hive中是没有这个udf,用Python的代码#!/home/tops/bin/python
#!/home/tops/bin/python
import sys
import hashlib
for line in sys.stdin:
line = line.strip()
arr = line.split()
md5_arr = []
for a in arr:
md5_arr.append(hashlib.md5(a).hexdigest())
print "\t".join(md5_arr)
在Hive中使用脚本(如,python和shell),首先要将他们加入:
add file /xxxx/test.py
然后,在程序中使用TRANSFORM语法调用:
SELECT
TRANSFORM (col1, col2) USING './test.py' AS (new1, new2)
FORM test;
其中,AS指定输出列,分别对应的列名。如果省略这句,Hive会将第1个tab前的结果作为key,后面其余作为value。
注意:TRANSFORM的分割符号,永远是\t。传入、传出脚本时都默认必须使用\t。没有其他分隔符
所以会出问题,在结合INSERT [OVERWRITE] table使用时,目标表的分隔符不是\t,是其他分隔符如';',
这样就会出错。
直接使用map 和reduce命令:
SELECT MAP (…) USING ‘xx.py’是使用的语法,
MAP、REDUCE只不过是TRANSFORM的别名,Hive不保证一定会在map/reduce中调用脚本。看看官方文档是怎么说的:
Formally, MAP ... and REDUCE ... are syntactic transformations of SELECT TRANSFORM ( ... ). In
other words, they serve as comments or notes to the reader of the query.
BEWARE: Use of these keywords may be dangerous as (e.g.) typing "REDUCE" does not force a reduce phase
to occur and typing "MAP" does not force a new map phase!
所以,混用map reduce语法关键字可能会引起混淆,所以建议都用TRANSFORM。
如果不是脚本文件,而是awk、sed等系统内置命令,可以直接使用(不用add file),如:
map reportdate, appid, channelname,app_version, deviceid,linux_time using '/bin/cat'
as reportdate, appid, channelname,app_version, deviceid,linux_time
cluster by appid, channelname,deviceid
如果,表中有MAP,ARRAY等复杂类型,
CREATE TABLE features
(
id BIGINT,
norm_features MAP<STRING, FLOAT>
);
用TRANSFORM命令进行操作,就是将脚本文件的输出,设置为对应格式,Python里面就是print出对应的格式,而复杂类型就用其对应的分隔符
如,MAP类型的KV分割符。
SELECT TRANSFORM(stuff)
USING 'script'
AS (thing1 INT, thing2 MAP<STRING, FLOAT>)
hive语句嵌入python脚本(进行map和reduce,实现左外连接)的更多相关文章
- 在C语言中如何嵌入python脚本
最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...
- freeswitch嵌入python脚本
操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install pyt ...
- Python 中的map和reduce学习笔记
map和reduce都是Python中的内置函数 map函数接受两个参数,第一个参数是函数,第二个参数是列表,将函数依次作用于列表中的元素,并返回一个元素 reduce同样以函数和列表作为参数,区别在 ...
- Python里的map、reduce、filter、lambda、列表推导式
Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...
- Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
- python中的map、reduce、filter、sorted函数
map.reduce.filter.sorted函数,这些函数都支持函数作为参数. map函数 map() 函数语法:map(function, iterable, ...) function -- ...
- Python 中的map、reduce函数用法
#-*- coding:UTF-8 -*- #map()函数接受两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回 def f(x): retu ...
- (转)Python函数式编程——map()、reduce()
转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...
随机推荐
- 这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView
本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发 <交互炸了>或许是一系列高端特效教程, 文中会介绍一些比较炫酷的特效,以及实现的思路.特效实现本身也许不会有太大的难度 ...
- Redis之(二)数据类型及存储结构
Redis支持五中数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集合). Redis定义了丰富的原语命令,可以直接与Redis ...
- Linux 中交换空间 (swap)应该分多大才好?
前一段时间,我们机房中一台Linux服务器运行缓慢,系统服务出现间歇性停止响应,让我过去处理一下这一问题,登录到服务器之后,发现此服务器的物理内存是16G,而最初装机的时候,系统管理人员却只分配了4G ...
- pdflush的工作原理
大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下,系统 ...
- PGM:贝叶斯网表示之朴素贝叶斯模型naive Bayes
http://blog.csdn.net/pipisorry/article/details/52469064 独立性质的利用 条件参数化和条件独立性假设被结合在一起,目的是对高维概率分布产生非常紧凑 ...
- Spring之Enterprise JavaBeans (EJB) integration
原文地址:需要FQ https://translate.google.com/translate?hl=zh-CN&sl=zh-CN&tl=zh-CN&u=http%3A%2F ...
- 设置TextView显示的文字可以复制
设置TextView显示的文字可以复制 效果图 在xml中设置 <TextView android:layout_width="wrap_content" android:l ...
- GDAL 2.0版本RPC校正速度测试
GDAL2.0版本的更新日志中提到了对RPC校正的优化,今天测试了一下,发现提升的速度还是蛮快的,测试的数据是一个IRS-P5的数据. 单线程测试 首先使用一个线程进行测试,使用下面的批处理进行运行, ...
- 剑指Offer--图的操作
剑指Offer–图的操作 前言 企业笔试过程中会涉及到数据结构的方方面面,现将有关图的深度优先搜索与广度优先搜索进行整理归纳,方便日后查阅. 在已做过的笔试题目中,可用DFS解决的题目有: & ...
- Android数据库Sqlite-android学习之旅(九)
简介 sqilte是一个轻量级的数据库,满足数据库的基本操作,由于移动端的内存有限,所以sqilte刚好能满足移动端开发的基本要求. 废话不多说,上代码 1.首先介绍一下,sqlite的管理类SQLi ...