博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive的Transform功能
阅读量:4362 次
发布时间:2019-06-07

本文共 1667 字,大约阅读时间需要 5 分钟。

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

SELECT date, count(uid)FROM xxxGROUP BY date

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

SELECT TRANSFORM(date, uid)FROM xxxCLUSTER 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_outputINSERT OVERWRITE TABLE pv_users_reducedSELECT 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_outputINSERT OVERWRITE TABLE pv_users_reducedREDUCE map_output.dt, map_output.uidUSING 'reduce_script'AS date, count;
    因此,原文中特别提醒,MAP并没有强制产生一个map过程的作用,REDUCE同理。只是为了阅读更清晰。

转载于:https://www.cnblogs.com/aquastone/p/hive-transform.html

你可能感兴趣的文章
ubuntu下安装新字体
查看>>
Django连接MySQL数据库
查看>>
漫游Kafka入门篇之简单介绍(1)
查看>>
redis学习之旅-初识Redis
查看>>
WinForm 小程序 NotePad
查看>>
JSTL 核心标签库 使用
查看>>
线程池ThreadPool
查看>>
hibernate入门实例
查看>>
WPF路由事件二:路由事件的三种策略(转)
查看>>
Java中的内存泄露
查看>>
asp.net 自定义控件验证FCKeditor是否为空
查看>>
oracle 查看表空间的脚本
查看>>
Python 描述符是什么?以及如何实现
查看>>
程序员的激情其实是一种痛苦
查看>>
MySQL后台线程的清理工作
查看>>
连接mysql数据库,创建用户模型
查看>>
cogs1885 [WC2006]水管局长数据加强版
查看>>
paramiko模块
查看>>
[原创]茗洋AaronYang的 jquery.myselect.js 我的一次前端突破[上]
查看>>
1083 是否存在相等的差
查看>>