在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,实现左外连接)的更多相关文章

  1. 在C语言中如何嵌入python脚本

    最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...

  2. freeswitch嵌入python脚本

    操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 python版本:2.7.9 开启python模块 安装python lib库 apt-get install pyt ...

  3. Python 中的map和reduce学习笔记

    map和reduce都是Python中的内置函数 map函数接受两个参数,第一个参数是函数,第二个参数是列表,将函数依次作用于列表中的元素,并返回一个元素 reduce同样以函数和列表作为参数,区别在 ...

  4. Python里的map、reduce、filter、lambda、列表推导式

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  5. Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

  6. Python函数式编程——map()、reduce()

    文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...

  7. python中的map、reduce、filter、sorted函数

    map.reduce.filter.sorted函数,这些函数都支持函数作为参数. map函数 map() 函数语法:map(function, iterable, ...) function -- ...

  8. Python 中的map、reduce函数用法

    #-*- coding:UTF-8 -*- #map()函数接受两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回 def f(x): retu ...

  9. (转)Python函数式编程——map()、reduce()

    转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...

随机推荐

  1. Docker Hub

    目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像.大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现. 登录 可以通过执行 ...

  2. MySQL系列教程(五)

    MyCAT MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性.可靠性.优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远 ...

  3. GDAL C#版本 "安全透明方法"问题解决方案

    之前写过一篇关于再C#中调用GDAL库出现OSGeo.GDAL.GdalPINVOKE"的类型初始值设定项引发异常的解决方案,博客地址见下: http://blog.csdn.net/lim ...

  4. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

  5. 自定义支持多行显示的RadioGroup

    自定义支持多行显示的RadioGroup 原生的RadioGroup继承自LinearLayout,即只能支持一横排或者一竖排的排列显示RadioButton 现在改写RadioGroup,使它支持多 ...

  6. JavaMail API 概述

    JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序. JavaMail API提供了一组抽象类定义构成一个邮件系统的对象.它是阅读,撰写和发送电子信息的可选包(标准扩 ...

  7. EJB通过注解方式注入并使用其他EJB或者服务、配置JBoss数据源

    通过注解方式注入并使用其他EJB或者服务 真实项目EJB对象很多,EJB之间也可以互相调用, 在项目HelloWorld下新建接口Other在cn.hqu.ejb3下: public interfac ...

  8. ProgressBar的简单使用

    当我们的应用在进行耗时操作时,显示一个进度条呈现给用户,让用户知道当前进度是一个很好的体验,接下来我们就来简单了解下ProgressBar(本文主要针对初学者,大神可以绕开啦),先看效果图: 进度条P ...

  9. 集合框架之List接口

    有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 与 set 不同,列表 ...

  10. EBS采购(PO)模块常用表

     select * from po_requisition_headers_all 请求头 select * from po_requisition_lines_all 请求行 select * ...