MaxCompute重装插足比赛 第五弹 - SELECT TRANSFOLacrosse

原标题:MaxCompute重装上沙场 第五弹 - SELECT TRANSFO酷威

UDTF

  • Hive中UDTF编写和应用

摘要: MaxCompute(原ODPS)是Ali云自己作主研究开发的全数产业界当先水平的分布式大额管理平台, 特别在公司内部得到广泛应用,支撑了五个BU的主导工作。 MaxCompute除了无休止优化品质外,也从事于升高SQL语言的客商体验和表明本事,升高相近ODPS开荒者的生产力。

UDAF

  • Hive udaf开荒入门和周转进度详细解释
  • Hive通用型自定义聚合函数(UDAF)

MaxCompute(原ODPS)是Ali云自己作主研究开发的持有产业界当先水平的分布式大数据处理平台, 特别在公司内部获得普遍应用,支撑了多个BU的宗旨业务。 MaxCompute除了不停优化质量外,也从事于提高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会将第3个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,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>)

MaxCompute基于ODPS2.0新一代的SQL引擎,显著晋级了SQL语言编写翻译进程的易用性与语言的表达才具。咱们在这里推出MaxCompute(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,本篇向您介绍MaxCompute对其他脚本语言的支撑

  • SELECT TRANSFORM。

  • 场景1

  • 本人的体系要动员搬迁到MaxCompute平台上,系统中本来有为数不少效用是运用脚本来完结的,包涵python,shell,ruby等剧本。 要迁移到MaxCompute上,作者急需把这么些本子全体都退换成UDF/UDAF/UDTF。更改进程不仅仅需求耗时人力,还亟需做壹遍又贰遍的测验,进而有限协理改产生的udf和原先的本子在逻辑上是等价的。小编期望能有更简短的迁徙格局。
  • 场景2
  • SQL比较专长的是群集操作,而自个儿索要做的业务要对一条数据做越多的精巧的计量,现成的内置函数无法方便人民群众的兑现自己想要的效能,而UDF的框架远远不足利索,况且Java/Python小编都不太熟谙。相比之下笔者更加长于写剧本。我就梦想能够写二个本子,数据全都输入到自己的脚本里来,作者要好来做各个总计,然后把结果输出。而MaxCompute平台就担当帮自个儿把多少做好切分,让自家的台本能够遍布式施行,担任数据的输入表和输出表的军管,担当JOIN,UNION等关联操作就好了。

上述作用能够应用SELECT TRANSFORM来得以完成

SELECT TRANSFORM 介绍

此文中运用MaxCompute Studio作浮现,首先,安装MaxCompute Studio,导入测量试验MaxCompute项目,创制工程,创立三个新的MaxCompute脚本文件, 如下

图片 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跑测量检验”的事例);

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 顾客会很心爱这几个意义

本文由葡京在线发布于互联网平台,转载请注明出处:MaxCompute重装插足比赛 第五弹 - SELECT TRANSFOLacrosse

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。