MaxCompute重装上阵 第五弹 - SELECT TRANSFOR

来源:https://www.tk-web.com 作者:赌博糖果派对手机版 人气:112 发布时间:2019-11-02
摘要:原标题:马克斯Compute重装上阵 第五弹 - SELECT TRANSFO福特Explorer UDTF Hive中UDTF编写和选取 摘要: 马克斯Compute(原ODPS卡塔 尔(英语:State of Qatar)是阿里云自主研究开发的有所产业界当先

原标题:马克斯Compute重装上阵 第五弹 - SELECT TRANSFO福特Explorer

UDTF

  • Hive中UDTF编写和选取

摘要: 马克斯Compute(原ODPS卡塔 尔(英语:State of Qatar)是阿里云自主研究开发的有所产业界当先水平的遍布式大数目管理平台, 极其在公司内部获得广泛应用,支撑了多少个BU的为主业务。 马克斯Compute除了无休止优化质量外,也从事于进步SQL语言的顾客体验和表明技能,升高周围ODPS开拓者的分娩力。

MaxCompute重装上阵 第五弹 - SELECT TRANSFOR。UDAF

  • Hive udaf开辟入门和平运动行进程详细明白
  • Hive通用型自定义聚合函数(UDAF卡塔 尔(英语:State of Qatar)

马克斯Compute(原ODPS卡塔 尔(阿拉伯语:قطر‎是Ali云自己作主研发的保有产业界当先水平的遍布式大数目管理平台, 极其在集团内部获得普及应用,支撑了多少个BU的基本业务。 马克斯Compute除了不停优化质量外,也从事于升高SQL语言的客商体验和表明才能,提升大规模ODPS开拓者的生产力。

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会将第4个tab前的结果作为key,前面别的作为value。

此间有三个小坑:不时候,大家结合INSERT OVE奇骏W传祺ITE使用上述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,A奥迪Q5RAY等复杂类型,怎么用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' "

率先弹 - 善用马克斯Compute编写翻译器的失实和警报

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小编都不太领会。比较之下笔者更专长写剧本。作者就愿意能够写三个本子,数据全都输入到本身的脚本里来,小编自身来做各个总括,然后把结果输出。而马克斯Compute平台就担任帮自个儿把多少做好切分,让自家的台本能够分布式履行,担任数据的输入表和输出表的保管,担负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 子句钦点的是要施行的授命,而非财富列表,这点和繁多的马克斯Compute SQL语法不风流洒脱致,这么做是为了和hive的语法保持万分。

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

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

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

  5. 利用自定义的财富(脚本文件,数据文件等卡塔 尔(阿拉伯语:قطر‎,能够选拔 set odps.sql.session.resources=foo.sh,bar.txt; 来钦点。可以钦定多少个resource文件,用逗号隔绝(由此不容许resource名字中隐含逗号和分集团卡塔 尔(英语:State of Qatar)。其余大家还提供了resources子句,可以在using 子句后边钦命 resources 'foo.sh', 'bar.txt' 来钦点财富,三种方法是等价的(参照他事他说加以考察“用odps跑测量检验”的例证卡塔 尔(阿拉伯语:قطر‎;

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 顾客会很心爱这一个成效

本文由bb电子糖果派对发布于赌博糖果派对手机版,转载请注明出处:MaxCompute重装上阵 第五弹 - SELECT TRANSFOR

关键词:

最火资讯