248cc永利集团官网 永利集团登录网址 在调用时,也从事于进步SQL语言的客商体验和表达技巧

在调用时,也从事于进步SQL语言的客商体验和表达技巧



原标题:马克斯Compute重装出席比赛 第五弹 – SELECT TRANSFO途乐

UDTF

  • Hive中UDTF编写和行使

摘要:
马克斯Compute(原ODPS卡塔 尔(英语:State of Qatar)是阿里云自己作主研究开发的全部产业界抢先水平的布满式大数据管理平台,
非常在集团内部获得遍布应用,支撑了八个BU的主干业务。
马克斯Compute除了无休止优化品质外,也从事于升高SQL语言的顾客体验和表明本领,进步周围ODPS开荒者的分娩力。

UDAF

  • Hive
    udaf开拓入门和平运动转进度详明
  • Hive通用型自定义聚合函数(UDAF卡塔尔

马克斯Compute(原ODPS卡塔尔是Ali云自己作主研究开发的有着产业界超越水平的布满式大数目管理平台,
越发在公司内部获得分布应用,支撑了三个BU的主干业务。
马克斯Compute除了不停优化品质外,也从事于提高SQL语言的客商体验和表明技艺,升高周边ODPS开采者的临盆力。

在调用时,也从事于进步SQL语言的客商体验和表达技巧。Hive中的TRANSFORM:使用脚本完毕Map/Reduce

转自:
http://www.coder4.com/archives/4052

率先来看一下多少:

hive> select * from test;
OK
1       3
2       2
3       1

比方,大家要出口每一列的md5值。在时下的hive中是平素不那几个udf的。

大家看一下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中,使用脚本,首先要将他们加入:

add file /xxxx/test.py

接下来,在调用时,使用TRANSFORM语法。

SELECT 
    TRANSFORM (col1, col2) 
    USING './test.py' 
    AS (new1, new2) 
FORM 
    test;

此处,大家选择了AS,内定输出的几何个列,分别对应到哪个列名。借使省略那句,则Hive会将首个tab前的结果作为key,前边别的作为value。

那边有三个小坑:不经常候,我们结合INSERT
OVEEscortW奥迪Q5ITE使用上述TRANSFORM,而指标表,其分割副恐怕不是t。然则请深深记住:TRANSFORM的细分符号,传入、传出脚本的,永久是t。不要思虑外面其余的划分符号!

谈起底,解释一下MAP、REDUCE。

在部分Hive语句中,我们或然会看出SELECT MAP (…) USING ‘xx.py’那样的语法。

而是,在Hive中,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吧。

友情提醒:假若脚本不是Python,而是awk、sed等系统内置命令,能够一贯利用,而不用add
file。

若是表中有MAP,ATucsonRAY等繁琐类型,怎么用TRANSFORM生成?

例如:

CREATE TABLE features
(
    id BIGINT,
    norm_features MAP<STRING, FLOAT> 
);

答案是,要在剧本的出口中,对至极字段依照HDFS文件中的格式输出就能够。

譬喻,以地点的表结构为例,每行输出应该为:

1^Ifeature1^C1.0^Bfeature2^C2.0

其中I是tab键,这是TRANSFORM要求的分割符号。B和^C是Hive存储时MAP类型的KV分割符。

其它,在Hive的TRANSFORM语句的时候,要介怀AS中增添项目注解:

SELECT TRANSFORM(stuff)
USING 'script'
AS (thing1 INT, thing2 MAP<STRING, FLOAT>)

马克斯Compute基于ODPS2.0新一代的SQL引擎,显然进步了SQL语言编写翻译进程的易用性与语言的表达技术。大家在那推出马克斯Compute(ODPS2.0)重装参与竞技种类文章

Hive中的TRANSFORM:自定义Mapper和Reducer完成Map/Reduce

/**
 * Mapper.
 */
public interface Mapper {
  /**
   * Maps a single row into an intermediate rows.
   * 
   * @param record
   *          input record
   * @param output
   *          collect mapped rows.
   * @throws Exception
   *           on error
   */
  void map(String[] record, Output output) throws Exception;
}

能够将一列拆分为多列

使用样例:

public class ExecuteMap {

    private static final String FULL_PATH_CLASS = "com.***.dpop.ods.mr.impl.";

    private static final Map<String, Mapper> mappers = new HashMap<String, Mapper>();

    public static void main(String[] args) throws Exception {
        if (args.length < 1) {
            throw new Exception("Process class must be given");
        }

        new GenericMR().map(System.in, System.out,
                getMapper(args[0], Arrays.copyOfRange(args, 1, args.length)));
    }

    private static Mapper getMapper(String parserClass, String[] args)
            throws ClassNotFoundException {
        if (mappers.containsKey(parserClass)) {
            return mappers.get(parserClass);
        }

        Class[] classes = new Class[args.length];
        for (int i = 0; i < classes.length; ++i) {
            classes[i] = String.class;
        }
        try {
            Mapper mapper = (Mapper) Class.forName(FULL_PATH_CLASS + parserClass).getConstructor(classes).newInstance(args);
            mappers.put(parserClass, mapper);
            return mapper;
        } catch (ClassNotFoundException e) {
            throw new ClassNotFoundException("Unknown MapperClass:" + parserClass, e);
        } catch (Exception e) {
            throw new  ClassNotFoundException("Error Constructing processor", e);
        }

    }
}

MR_USING=" USING 'java -Xmx512m -Xms512m -cp ods-mr-1.0.jar:hive-contrib-2.3.33.jar com.***.dpop.ods.mr.api.ExecuteMap "

COMMAND="FROM dw_rtb.event_fact_adx_auction "
COMMAND="${COMMAND} INSERT overwrite TABLE dw_rtb.event_fact_mid_adx_auction_ad PARTITION(yymmdd=${CURRENT_DATE}) SELECT transform(search_id, print_time, pthread_id, ad_s) ${MR_USING} EventFactMidAdxAuctionAdMapper' as search_id, print_time, pthread_id, ad_s, ssp_id WHERE $INSERT_PARTITION and original = 'exinternal' "

第一弹 – 善用MaxCompute编写翻译器的荒唐和警报

Hive Python Streaming的原理及写法

http://www.tuicool.com/articles/vmumUjA

其次弹 – 新的为主数据类型与内建函数

其三弹 – 复杂类型

第四弹 – CTE,VALUES,SEMIJOIN

上次向您介绍了CTE,VALUES,SEMIJOIN,本篇向你介绍马克斯Compute对此外脚本语言的扶助

  • SELECT TRANSFORM。

  • 场景1

  • 本人的系列要迁移到马克斯Compute平台上,系统中原本有点不清效果与利益是应用脚本来达成的,包罗python,shell,ruby等剧本。
    要迁移到马克斯Compute上,我供给把那几个本子全体都改过成UDF/UDAF/UDTF。改动进程不仅仅供给耗时人力,还必要做贰遍又二回的测验,进而保险更换成的udf和原本的剧本在逻辑上是等价的。小编希望能有更简约的动员搬迁格局。
  • 场景2
  • SQL相比长于的是汇聚操作,而本身须求做的作业要对一条数据做越来越多的精雕细刻的估摸,现成的放到函数不可能实惠的兑现自己想要的意义,而UDF的框架相当不足灵活,并且Java/Python笔者都不太熟习。相比较之下作者更加长于写剧本。笔者就目的在于能够写一个剧本,数据全都输入到自家的台本里来,小编本人来做种种总计,然后把结果输出。而MaxCompute平台就肩负帮小编把数量做好切分,让自身的剧本能够分布式履行,担当数据的输入表和输出表的田间处理,担当JOIN,UNION等事关操作就好了。

上述功用能够运用SELECT TRANSFORM来促成

SELECT TRANSFORM 介绍

此文中使用MaxCompute Studio作体现,首先,安装马克斯Compute
Studio,导入测验马克斯Compute项目,创制工程,创设一个新的马克斯Compute脚本文件, 如下

图片 1

交由作业能够见到实行安插(全体进行后的视图卡塔 尔(阿拉伯语:قطر‎:

图片 2

Select
transform允许sql顾客钦命在服务器上实行一句shell命令,将中游数据各字段用tab分隔,每条记下黄金时代行,逐行输入shell命令的stdin,并从stdout读取数据作为出口,送到上游。Shell命令的原形是调用Unix的有些utility,因而得以运转其余的脚本解释器。满含python,java,php,awk,ruby等。

该命令宽容Hive的Transform作用,能够参照Hive的文档。一些亟待注意的点如下:

  1. Using
    子句钦赐的是要履行的指令,而非财富列表,那点和一大半的MaxCompute
    SQL语法不平等,这么做是为了和hive的语法保持包容。

  2. 输入从stdin传入,输出从stdout传出;

  3. 能够配备分隔符,暗中同意使用 t 分隔列,用换行分隔行;

  4. 能够自定义reader/writer,但用内置的reader/writer会快非常多

  5. 动用自定义的能源(脚本文件,数据文件等卡塔尔国,能够使用 set
    odps.sql.session.resources=foo.sh,bar.txt;
    来钦赐。能够钦定三个resource文件,用逗号隔开分离(由此不允许resource名字中含有逗号和分行卡塔尔。别的大家还提供了resources子句,能够在using
    子句后面钦定 resources ‘foo.sh’, ‘bar.txt’
    来内定能源,三种方法是等价的(参谋“用odps跑测量试验”的事例卡塔 尔(英语:State of Qatar);

6.
财富文件会被下载到实行内定命令的劳作目录,能够运用文件接口展开./bar.txt文件。

当下odps select transform完全相配了hive的语法、成效和表现,蕴涵input/output row format 以至reader/writer。Hive上的剧本,半数以上能够直接拿来运营,部分脚本只须要经过轻松校正就可以运转。其它大家比比较多功效都用比hive更加高施行效用的语言
(C++) 重构,用以优化质量。

运用项景比方

理论上select transform能兑现的作用udtf都能落到实处,可是select
transform比udtf要灵活得多。且select
transform不独有援救java和python,还扶植shell,perl等其他脚本和工具。
且编写的经过要简明,极度切合adhoc效用的兑现。举多少个例子:

  1. 兴妖作怪造数据

图片 3

要么采纳python

图片 4

地点的语句造出黄金时代份有50行的数据表,值是从1到50;
测验时候的数目就足以方便造出来了。功用相通轻便,但以前是odps的叁个痛点,未有低价的不二秘籍造数据,就不实惠测验以至初读书人的学习和切磋。当然那也得以透过udtf来兑现,可是急需复杂的流程:踏向ide->写udtf->打包->add
jar/python->create function->施行->drop function->drop
resource。

  1. awk 客户会很欢跃那个意义

图片 5

地点的说话仅仅是把value原样输出,不过熟习awk的客户,今后过上了写awk脚本不写sql的光景

  1. 用odps跑测试

图片 6

或者

图片 7

本条例子是为着表明,超多java的utility能够一直拿来运作。java和python就算有现有的udtf框架,不过用select
transform编写更简单,并且无需格外正视,也不曾格式要求,以致能够兑现离线脚本拿来向来就用。

  1. 帮衬任何脚本语言

select transform (key, value) using “perl -e ‘while($input =
<STDIN>){print $input;}'” from src;

地点用的是perl。那实在不只是语言帮忙的扩大,一些简易的功力,awk,
python, perl, shell
都援助直接在命令里面写剧本,无需写脚本文件,上传财富等进度,开辟进程更简明。其余,由于当下大家总计集群上尚未php和ruby,所以这三种脚本不帮忙。

  1. 能够串联着用,使用 distribute by和 sort by对输入数据做预管理

图片 8

或许用map,reduce的重要字会让逻辑显得清楚一些

图片 9

讨论上OpenMWrangler的模型都足以映射到上边的臆度进程。注意,使用map,reduce,select
transform那多少个语法其实语义是生龙活虎律的,用哪些关键字,哪个种类写法,不影响一贯进程和结果。

性能

质量上,SELECT TRANSFORM 与UDTF
相持不下。经过多样情景相比较测验,数据量超级小时,大大多情景下select
transform有优势,而数据量大时UDTF有优势。由于transform的开采越发便利,所以select
transform非常相符做adhoc的数目深入分析。

UDTF的优势:

  1. UDTF是有项目,而Transform的子进度基于stdin/stdout传输数据,全数数据都看成string管理,由此transform多了一步类型调换;
  2. Transform数据传输看重于操作系统的管道,而最近管道的buffer只有4KB,且不能够安装,
    transform读/写 空/满 的pipe会招致进度被挂起;
  3. UDTF的常量参数能够不用传输,而Transform不能利用那个优化。

SELECT TRANSFORM 的优势:

  1. 子进度和父进程是七个进程,而UDTF是单线程的,若是总括占比比较高,数据吞吐量超级小,能够使用服务器的多核特性
  2. 数据的传导通过更底层的系统调用来读写,功效比java高
  3. SELECT
    TRANSFORM辅助的少数工具,如awk,是natvie代码实现的,和java比较理论上也许会有质量优势。

小结

马克斯Compute基于ODPS2.0的SQL引擎,提供了SELECT
TRANSFORM功用,能够显明简化对台本代码的引用,与此同不常候,也加强了品质!我们引入您尽或许利用SELECT
TRANSFORM。

标注

  • 注意气风发,USING
    前面包车型大巴字符串,在后台是直接起的子进度来调起命令,未有起shell,所以shell的一点语法,如输入输出重定向,管道等是不支持的。假如顾客必要能够以
    shell 作为命令,真正的通令作为数据输入,仿照效法“无理取闹造数据”的事例;
  • 注二,JAVA 和 PYTHON 的实在路线,能够从JAVA_HOME 和 PYTHON_HOME
    意况变量中收获作业;

作者:隐林

本文为云栖社区原创内容,未经同意不得转发。归来知乎,查看越多

主要编辑:

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图