Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况。例如,按日期统计每天出现的uid数,通常用如下的SQL

SELECT date, count(uid)
FROM xxx
GROUP BY date

但是,如果我想在reduce阶段对每天的uid形成一个列表,进行排序并输出,这在Hive中没有现成的功能。那么,可以自写脚本实现该功能,并用TRANSFORM关键字调用

SELECT TRANSFORM(date, uid)
FROM xxx
CLUSTER BY date

这是一个类似streaming的功能,但是可以更方便的访问Hive中的数据,也可以把SQL语句和自写脚本整合在一起运行。

简单分析官网上的一个例子

FROM (
FROM pv_users
SELECT TRANSFORM(pv_users.userid, pv_users.date)
USING 'map_script'
AS dt, uid
CLUSTER BY dt
) map_output
INSERT OVERWRITE TABLE pv_users_reduced
SELECT TRANSFORM(map_output.dt, map_output.uid)
USING 'reduce_script'
AS date, count;

这段代码的大致工作流程描述如下:

map_script作为mapper,reduce_script作为reducer。将pv_users表中的userid, date两列作为mapper的输入字段,处理后的输出的前两个字段分别命名为dt, uid,并按照dt字段作partition和sort送给reduce阶段处理。reducer的输入字段为dtuid,输出处理后的前两个字段,并命名为date, count,写入到pv_users_reduced表中。

这里有几个细节:

  • mapper和reducer用到的script可以是任何可执行文件。注意如果用到的是本地文件,应当在语句开始前用ADD FILEADD FILES将文件加入进来
  • mapper和reducer的输入输出都是以TAB为分隔符
  • 如果USING ‘script’语句后面没有AS,则Hive默认script的输出中第一个TAB之前的字段为key,后面的部分全部为value。若指定了AS,则严格按照AS后面的字段数输出,例如AS dt, uid,则输出前两个字段并忽略后面的字段。此外,AS语句可以指定数据类型,如AS (date STRING, count INT)。默认都是string类型。
  • CLUSTER BY关键字是DISTRIBUTE BYSORT BY的简写,这两者可以认为对应与Hadoop的partition和sort过程。如果partition和sort的key是不同的,可以使用DISTRIBUTE BYSORT BY分别指定。
  • MAPREDUCE关键字是SELECT TRANSFORM关键字的别名,原文中给出了上面等价代码
    FROM (
    FROM pv_users
    MAP pv_users.userid, pv_users.date
    USING 'map_script'
    AS dt, uid
    CLUSTER BY dt
    ) map_output
    INSERT OVERWRITE TABLE pv_users_reduced
    REDUCE map_output.dt, map_output.uid
    USING 'reduce_script'
    AS date, count;

    因此,原文中特别提醒,MAP并没有强制产生一个map过程的作用,REDUCE同理。只是为了阅读更清晰。

Hive的Transform功能的更多相关文章

  1. HIVE的transform函数的使用

    Hive的TRANSFORM关键字提供了在SQL中调用自写脚本的功能,适合实现Hive中没有的功能又不想写UDF的情况.例如,按日期统计每天出现的uid数,通常用如下的SQL SELECT date, ...

  2. [HIve - LanguageManual] Transform [没懂]

    Transform/Map-Reduce Syntax SQL Standard Based Authorization Disallows TRANSFORM TRANSFORM Examples ...

  3. 使用pyspark模仿sqoop从oracle导数据到hive的主要功能(自动建表,分区导入,增量,解决数据换行符问题)

    最近公司开始做大数据项目,让我使用sqoop(1.6.4版本)导数据进行数据分析计算,然而当我们将所有的工作流都放到azkaban上时整个流程跑完需要花费13分钟,而其中导数据(增量)就占了4分钟左右 ...

  4. 在CSS3中,可以利用transform功能来实现文字或图像的旋转、缩放、倾斜、移动这四种类型的变形处理

    CSS3中的变形处理(transform)属 transform的功能分类 1.旋转 transform:rotate(45deg); 该语句使div元素顺时针旋转45度.deg是CSS 3的“Val ...

  5. Hive使用简介

    ---恢复内容开始--- 指定分隔符 HIVE输出到文件的分隔符 ,列与列之间是'\1'(ASCII码1,在vim里显示为^A),列内部随着层数增加,分隔符依次为'\2','\3','\4'等. 例: ...

  6. hive -- 自定义函数和Transform

    hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...

  7. Hive学习笔记——HQL用法及UDF,Transform

    Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格.”\t”.”\x001″).行分隔符 (”\n”)以及读取文件数据的方法(Hive 中 ...

  8. hive学习笔记

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  9. 【原】hive 操作笔记

    1.建表: hive> CREATE TABLE pokes (foo INT, bar STRING); hive> CREATE TABLE invites (foo INT, bar ...

随机推荐

  1. 异步上传图片,光用jquery不行,得用jquery.form.js插件

    异步上传图片,光用jquery不行,得用jquery.form.js插件,百度一下下载这个插件,加jquery,引入就可以了 <form id="postbackground" ...

  2. Hibernate4集成 Annotation使用教程

    Spring4 MVC Hibernate4集成 Annotation 一.    本文所用环境 Spring4.0.3.RELEASE.Hibernate4.3.5.Final.Mysql 二.   ...

  3. default(T)的含义

    default(T)是泛型中初始化的用法.因为对于泛型T你不知道是值类型还是引用类型,所以传参数是可能会出错.这里就要用到default(T). T t=default(T),就是初始化,值类型的话, ...

  4. mysql 内连接 左连接 右连接 外连接

    mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...

  5. .net ftp上传文件方法

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  6. SQL SERVER 2008函数大全(含例子)

    --SQL SERVER 2008 函数大全 /* author:TracyLee csdncount:Travylee */ /* 一.字符串函数: 1.ascii(字符串表达式)    返回字符串 ...

  7. Linux之free命令

    from http://www.cnblogs.com/peida/archive/2012/12/25/2831814.html free命令可以显示Linux系统中空闲的.已用的物理内存及swap ...

  8. (三)stm32之串口通信DMA传输完成中断

    一.DMA功能简介 首先唠叨一下DMA的基本概念,DMA的出现大大减轻了CPU的工作量.在硬件系统中,主要由CPU(内核).外设.内存(SRAM).总线等结构组成,数据经常要在内存和外设之间,外设和外 ...

  9. 免费在线客服QQ_网页接入及使用说明

    首先,注册一个QQ (haha,我觉得也是废话) 到QQ推广的网站设置,生成代码 链接:http://shang.qq.com/v3/widget.html 选择“免费开通”,然后就会看到下图,一般只 ...

  10. Android控件_TextView(显示文本框控件)

    一.TextView控件的常用属性  1.android:id——控件的id   2.android:layout_width——设置控件的宽度 wrap_content(包裹实际文本内容) fill ...