在调用时,也致力于提升SQL语言的用户体验和表达能力

原标题:马克斯Compute重装加入比赛 第五弹 – SELECT TRANSFO奥迪Q3

UDTF

  • Hive中UDTF编写和行使

摘要:
马克斯Compute(原ODPS卡塔尔国是Ali云自己作主研究开发的装有产业界超过水平的分布式大数额管理平台,
特别在公司内部获得分布应用,支撑了八个BU的主导职业。
马克斯Compute除了不停优化质量外,也从事于提高SQL语言的客户体验和表明手艺,提升大规模ODPS开拓者的生产力。

UDAF

  • Hive
    udaf开荒入门和平运动作进程详细解释
  • Hive通用型自定义聚合函数(UDAF卡塔尔国

马克斯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

pc加拿大28预测网站,若是,大家要出口每一列的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会将第2个tab前的结果作为key,前边别的作为value。

那边有二个小坑:有的时候候,大家结合INSERT
OVE奥迪Q5W福特ExplorerITE使用上述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,AKoleosRAY等繁缛类型,怎么用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语言编写翻译进程的易用性与语言的表达工夫。大家在这里推出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' "

先是弹 – 善用马克斯Compute编写翻译器的失实和警示

Hive Python Streaming的准绳及写法

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

其次弹 – 新的骨干数据类型与内建函数

其三弹 – 复杂类型

第四弹 – CTE,VALUES,SEMIJOIN

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

  • SELECT TRANSFORM。

  • 场景1

  • 自身的种类要搬迁到MaxCompute平台上,系统中原来有成千上万功效是采用脚本来达成的,包蕴python,shell,ruby等剧本。
    要迁移到马克斯Compute上,笔者要求把那一个本子全部都改换成UDF/UDAF/UDTF。更正进度不止需求耗时人力,还索要做二回又三遍的测验,进而保险更换成的udf和原先的剧本在逻辑上是等价的。作者愿意能有更简单的搬迁情势。
  • 场景2
  • SQL比较长于的是聚众操作,而小编供给做的事体要对一条数据做更加多的精致的计算,现存的停放函数不能够方便的达成自身想要的效率,而UDF的框架缺乏灵活,並且Java/Python小编都不太熟知。相比较之下小编更擅长写剧本。作者就巴望能够写叁个剧本,数据全都输入到小编的本子里来,小编要好来做各类总计,然后把结果输出。而马克斯Compute平台就承当帮自身把数量做好切分,让本人的剧本能够遍布式实施,担当数据的输入表和输出表的扣押,负责JOIN,UNION等关联操作就好了。

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

SELECT TRANSFORM 介绍

此文中利用马克斯Compute Studio作体现,首先,安装马克斯Compute
Studio,导入测量试验马克斯Compute项目,制造工程,创建二个新的马克斯Compute脚本文件, 如下

pc加拿大28预测网站 1

交给作业能够旁观举行安插(全体实行后的视图卡塔尔:

pc加拿大28预测网站 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名字中含有逗号和总局卡塔尔。其余大家还提供了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. 无理取闹造数据

pc加拿大28预测网站 3

照旧利用python

pc加拿大28预测网站 4

地点的语句造出生龙活虎份有50行的数据表,值是从1到50;
测量试验时候的数码就可以方便造出来了。功效周围轻巧,但从前是odps的一个痛点,未有平价的方法造数据,就不方便人民群众测验以致初读书人的求学和追究。当然那也足以通过udtf来兑现,然则急需复杂的流水生产线:步入ide->写udtf->打包->add
jar/python->create function->推行->drop function->drop
resource。

  1. awk 客户会很心爱这么些职能

相关文章