图片 11

Hive的Transform和UDF

摘要:
马克斯Compute(原ODPS)是Ali云自己作主研究开发的具备产业界超过水平的布满式大数量管理平台,
极其在公司内部获得分布应用,支撑了多少个BU的骨干工作。
马克斯Compute除了无休止优化品质外,也从事于升高SQL语言的顾客体验和表明技能,升高周围ODPS开采者的生产力。

SELECT*frommytable1 aLEFTANTIJOINmytable2 bona.id=b.id;

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
OVE奥迪PB18W奇骏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奥迪Q3RAY等复杂类型,怎么用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>)

图片 1

2

UDAF

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

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

SELECT*frommytable1whereidin(selectidfrommytable2wherevalue=
mytable1.value);

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' "

作者:隐林

正在开垦新项目,必要给一个小数码表企图些基本数据,可是尚未INSERT …
VALUES
语句,无法把数量和创设表的DDL放在一块儿敬重,只可以另用一些剧本,调用ODPS命令行准备数据。。。

Hive Python Streaming的法规及写法

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

Select
transform允许sql客户钦点在服务器上施行一句shell命令,将上游数据各字段用tab分隔,每条记下一行,逐行输入shell命令的stdin,并从stdout读取数据作为出口,送到下游。Shell命令的本质是调用Unix的部分utility,因此得以运维其余的台本解释器。包蕴python,java,php,awk,ruby等。

即使mytable2中的全体id都不为NULL,则等效于

UDTF

  • Hive中UDTF编写和使用

SELECT TRANSFORM 的优势:

例如:

商量上select transform能达成的效果与利益udtf都能兑现,不过select
transform比udtf要灵活得多。且select
transform不仅仅匡助java和python,还接济shell,perl等别的脚本和工具。
且编写的经过要简明,非常符合adhoc功用的实现。举多少个例证:

事实上的逻辑实践顺序是 FROM->WHERE->GROUY
BY->HAVING->SELECT->O本田UR-VDER
BY->LIMIT,前两个是后贰个的输入,与正规的书写语序实际并不一样样。比相当多便于模糊的标题,都以通过引起的。举例order
by中只好援引select列表中生成的列,并不是拜谒FROM的源表中的列。HAVING可以访问的是
group by key和聚合函数。SELECT的时候,假诺有GROUP BY,就不得不访问group
key和聚合函数,并不是FROM中源表中的列。

地方用的是perl。这件事实上不止是语言支持的扩充,一些简短的遵守,awk,
python, perl, shell
都援助直接在命令里面写剧本,无需写脚本文件,上传能源等经过,开垦进度更简单。别的,由于当下我们总结集群上并未有php和ruby,所以这三种脚本不帮忙。

别的改革

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

挥洒顺序和施行顺序一致,就不便于混淆视听了。那样有二个附加的好处,在MaxCompute
Studio中写SQL语句的时候,会有智能提醒的机能,借使是SELECT在前,书写select列表的表明式的时候,因为FROM还未有写,马克斯Compute
Studio不能够知道或然拜见那多少个列,也就不可能做提醒。如下

  1. 兴妖作怪造数据

图片 2

图片 3

图片 4

采用场景比如

能够见见对src读后实行过滤的DAG。对src的读取与过滤在漫天实行计划中只需求壹回( 注1 )。

力排众议上OpenMCRUISER的模子都得以映射到地点的计算进程。注意,使用map,reduce,select
transform那多少个语法其实语义是一样的,用哪个关键字,哪个种类写法,不影响一向进度和结果。

IN SUBQUERY与LEFT SEMI JOIN类似。

主要编辑:

selectabs(-1),length(‘abc’),getdate();

原题目:马克斯Compute重装上沙场 第五弹 – SELECT TRANSFOENVISION

是否联结大概不同子查询,是由ODPS2.0的依照代价的优化器
(CBO)做出决定的,SQL自身的书写格局,不管是CTE依旧子查询,并不可能担保物理实行安插的合并大概不一致。

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

等效于

属性上,SELECT TRANSFORM 与UDTF
平分秋色。经过各个气象相比较测量检验,数据量较时辰,大好些个处境下select
transform有优势,而数据量大时UDTF有优势。由于transform的支出特别便捷,所以select
transform非常适合做adhoc的数额分析。

图片 5

或者

SELECT*frommytable1 aLEFTSEMIJOINmytable2 bona.id=b.id;

图片 6

SELECT*frommytable1 aLEFTANTIJOINmytable2 bona.id=b.id;

本条事例是为着验证,相当多java的utility能够一向拿来运营。java和python就算有现存的udtf框架,可是用select
transform编写更简明,何况无需额外信赖,也绝非格式须要,以至能够达成离线脚本拿来一贯就用。

SELECT*FROMsrcUNIONALLSELECT*FROMsrc;

该命令包容Hive的Transform功效,能够参照他事他说加以考察Hive的文书档案。一些内需留神的点如下:

本来ODPS也帮忙IN SUBQUE奥迪Q5Y,不过不帮忙correlated条件,马克斯Compute扶助

  • SELECT TRANSFORM。

  • 场景1

  • 本人的体系要搬迁到马克斯Compute平台上,系统中原本有广大功效是利用脚本来完结的,包含python,shell,ruby等剧本。
    要迁移到MaxCompute上,小编索要把这么些本子全体都更改成UDF/UDAF/UDTF。改造进度不唯有需求耗时人力,还需求做一次又二遍的测量试验,进而保险退换成的udf和原本的脚本在逻辑上是等价的。小编愿意能有更轻便的迁移形式。
  • 场景2
  • SQL比较擅长的是汇集操作,而自己索要做的事体要对一条数据做更加多的精细的总括,现存的放置函数不能够有益的兑现本身想要的效果,而UDF的框架远远不够灵活,况且Java/Python小编都不太熟习。相比较之下笔者更擅长写剧本。作者就期待能够写七个剧本,数据全都输入到本身的台本里来,小编自身来做各个总结,然后把结果输出。而马克斯Compute平台就肩负帮笔者把多少做好切分,让作者的剧本能够布满式实行,肩负数据的输入表和输出表的管制,肩负JOIN,UNION等关乎操作就好了。

ODPS1.0不匡助顶层UNION。ODPS2.0方可支撑,举个例子

上述功效能够利用SELECT TRANSFORM来贯彻

Common Table Expression (CTE)

6.
财富文件会被下载到实践钦定命令的办事目录,能够动用文件接口张开./bar.txt文件。

此效率主借使有益从另外数据库系统迁移,对于信贷买,大家依然引入您使用JOIN,显明表暗暗提示图

地点的讲话仅仅是把value原样输出,不过熟习awk的客户,从此过上了写awk脚本不写sql的光阴

标注

  1. 子进度和父进度是四个经过,而UDTF是单线程的,如若计算占比相比较高,数据吞吐量比相当小,能够选择服务器的多核特性
  2. 多少的传导通过更底层的系统调用来读写,功用比java高
  3. SELECT
    TRANSFORM帮助的一些工具,如awk,是natvie代码达成的,和java比较理论上大概会有总体性优势。

还会有一种VALUES表的奇特殊形体式

此文中央银行使马克斯Compute Studio作展现,首先,安装马克斯Compute
Studio,导入测验马克斯Compute项目,创制工程,组建贰个新的MaxCompute脚本文件, 如下

注1

图片 7

SELECTDISTINCT*FROM(SELECT*FROMsrc1UNIONALLSELECT*FROMsrc2) t;

马克斯Compute(原ODPS)是Ali云自己作主研究开发的保有产业界超越水平的布满式大数额管理平台,
越发在公司内部获得分布应用,支撑了八个BU的基本工作。
马克斯Compute除了不停优化品质外,也从事于提高SQL语言的顾客体验和表明技艺,提升广大ODPS开垦者的生产力。

想测量检验七个新写的UDF,只写SELECT
myudf(‘123’);会报错,还必需创设二个dual表,里面加一行数据,好辛勤。假诺测量试验UDAF,还要在测验表里面盘算多行数据,每一遍测量检验差别的输入都要修改表内容照旧创立新表,即使有个点子不用创造表也能例外的数码整合测量试验自个儿的UDF就好了。。。

  • 注一,USING
    后边的字符串,在后台是直接起的子进度来调起命令,未有起shell,所以shell的有些语法,如输入输出重定向,管道等是不协理的。假使客户须要能够以
    shell 作为命令,真正的吩咐作为数据输入,参照他事他说加以考察“无事生非造数据”的例子;
  • 注二,JAVA 和 PYTHON 的骨子里路径,能够从JAVA_HOME 和 PYTHON_HOME
    意况变量中拿走作业;

返回

图片 8

例如:

现阶段odps select transform完全相配了hive的语法、功效和行事,包罗input/output row format 以及
reader/writer。Hive上的本子,超越百分之五十方可平昔拿来运作,部分脚本只要求经过简单改培养可以运转。别的我们相当多功效都用比hive更加高实践功用的言语
(C++) 重构,用以优化品质。

SELECT*frommytable1whereidnotin(selectidfrommytable2);

付出作业能够见见举行安插(全体进展后的视图):

试行的成效也等于

UDTF的优势:

例如:

  1. 协理其余脚本语言

FROMsrc tWHEREvalue >0GROUPBYkeyHAVING sum(value) >100SELECTkey,
max(value)ORDERBYkeyLIMIT100;

其三弹 – 复杂类型

重临左表中的数据,当join条件不创制,也正是mytable第11中学某行的id在mytable2的具备id中尚无出现过,此行就封存在结果聚集

  1. 用odps跑测试

马克斯Compute大大扩展了DML语句的支撑,在易用性,包容性和属性方面,能够越来越好的满意你的要求。对于SQL相比较熟练的大家会发觉,上述成效大部分是明媒正娶的SQL支持的效能。马克斯Compute会持续进级与标准SQL和产业界常用产品的包容性。

图片 9

其间M1, M2,
M4多少个布满式职务分别对应相应八个输入表,双击M2能够看来中实际实践的DAG(在DAG中另行双击可以回去),如下

马克斯Compute基于ODPS2.0新一代的SQL引擎,分明升高了SQL语言编写翻译进度的易用性与语言的表明技艺。大家在此推出马克斯Compute(ODPS2.0)重装参预竞赛体系作品

例如:

马克斯Compute基于ODPS2.0的SQL引擎,提供了SELECT
TRANSFORM功用,能够显明简化对剧本代码的援引,与此同期,也增进了质量!我们引入你尽只怕使用SELECT
TRANSFORM。

例如:

图片 10

只会回到mytable第11中学的数据,只要mytable1的id在mytable2的id中现身过

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

马克斯Compute基于ODPS2.0新一代的SQL引擎,显明进步了SQL语言编译进度的易用性与语言的表达技巧。大家在此推出马克斯Compute(ODPS2.0)重装上沙场种类小说

  1. UDTF是有档案的次序,而Transform的子进程基于stdin/stdout传输数据,全数数据都看作string管理,因而transform多了一步类型转变;
  2. Transform数据传输重视于操作系统的管道,而当前管道的buffer独有4KB,且不能够安装,
    transform读/写 空/满 的pipe会导致进度被挂起;
  3. UDTF的常量参数能够不用传输,而Transform不能利用那个优化。

EXISTS SUBQUERY/NOT EXISTS SUBQUERY

  1. awk 顾客会很欢愉那个效用

图片 11

相关文章