马克斯Compute重装参Gaby赛 第五弹 - SELECT TRANSFOQX56

主编:

注1

Hive Python Streaming的规律及写法

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

# this url is for odpscmd update

其三弹 - 复杂类型

实质上,VALUES表并不限于在INSERT语句中动用,任何DML语句都能够选择。

UDTF

  • Hive中UDTF编写和应用
  1. FAILED: ODPS-00一千0:System internal error - fuxi job failed, WorkerPackageNotExist:必要安装set odps.task.major.version=unstructured_data
  2. FAILED: ODPS-00一千0:System internal error - std::exception:Message: a timeout was reached:一般情况下是OTS的endpoint填写错误,导致ODPS无法访问,能够咨询ots_support旺旺账号
  3. logview invalid end_point:在实践进度中,会回到叁个logview UCR-VL地址,假设使用浏览器访谈该地址再次回到错误,可能是布局不对,请检查 马克斯Compute 配置,并发问 odps_support 旺旺账号
  1. 子进程和父进度是几个进度,而UDTF是单线程的,假若总括占比比较高,数据吞吐量一点都相当小,能够利用服务器的多核天性
  2. 数码的传输通过更底层的系统调用来读写,功用比java高
  3. SELECT TRANSFORM扶助的一些工具,如awk,是natvie代码完成的,和java比较理论上可能会有总体性优势。

还大概有一种VALUES表的特殊形式

UDAF

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

本篇小说就以三个小白用户的地位体验如何行使 MaxCompute-SQL 查询表格存款和储蓄在那之中的多少,以及如何支付自定义逻辑(User Defined Function, UDF)来管理用户特定的数据格式。

其次弹 - 新的中央数据类型与内建函数

试行的效率相当于

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奇骏WPAJEROITE使用上述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大切诺基RAY等繁杂类型,怎么用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 在 2.0 版本的乘除框架手艺辅助直接采访 TableStore 数据,该版本还在灰度上线中,方今还亟需 申请MaxCompute 2.0试用,具体开通使用办法请参见 哪些申请试用MaxCompute 2.0。

新濠天地 1

Common Table Expression (CTE)

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

然后,策画好三个报表存款和储蓄的实例以及一张数据表,报表存款和储蓄实例管理,策动好实例名、EndPoint,为了差异其余产品的AccessId和AccessKey,前边我们称之为TableStore-InstanceName,TableStore-EndPoint。

本条例子是为着注明,相当多java的utility能够一直拿来运作。java和python即使有现有的udtf框架,不过用select transform编写更简便易行,何况无需非常依赖,也未尝格式须求,以致足以完结离线脚本拿来从来就用。

协助顶层UNION

// 总计编号 4 以下的车子在时间戳 1469171387 以前的平均速度和平均百公里油耗

新濠天地 2

新濠天地 3

关联的数据表消息如下:

马克斯Compute基于ODPS2.0新一代的SQL引擎,鲜明进级了SQL语言编写翻译进程的易用性与语言的表明技巧。我们在此推出马克斯Compute(ODPS2.0)重装上战地种类文章

对此NOT IN SUBQUERubiconY,类似于LEFT ANTI JOIN,不过有好几确定差别

access_key= ODPS-AccessKey

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

SELECT*frommytable1wherenotexists(select*frommytable2whereid= mytable1.id);`

set odps.task.major.version=2dot0_demo_flighting;

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

例如:

 

该命令包容Hive的Transform成效,能够参见Hive的文书档案。一些亟待小心的点如下:

例如:

写在最后

MaxCompute(原ODPS)是Ali云自己作主研发的装有产业界超越水平的分布式大数据管理平台, 特别在公司内部获得遍布应用,支撑了四个BU的大旨业务。 马克斯Compute除了不停优化品质外,也从事于进步SQL语言的用户体验和表明技术,提升周围ODPS开辟者的生产力。

马克斯Compute支持以试行顺序书写查询语句,譬如地点的言语能够写为

 

现阶段odps select transform完全相称了hive的语法、功用和行为,包罗input/output row format 以及 reader/writer。Hive上的台本,大多数足以直接拿来运营,部分脚本只须求通过简单退换就可以运转。别的大家很多效果都用比hive越来越高施行效能的言语 (C++) 重构,用以优化质量。

支持IMPLICIT JOIN

set odps.sql.planner.mode=lot;

  1. awk 用户会相当的慢乐这么些效应

原有ODPS也支持[NOT] IN SUBQUE奥迪Q5Y不作为JOIN条件,譬喻出现在非WHERE语句中,也许就算在WHERE语句中,但不能够转变为JOIN条件。马克斯Compute还是支撑这种用法,不过此时因为不恐怕转变为SEMI JOIN而必须贯彻运维八个单独的功课来运维SUBQUECRUISERY,所以不协助correlated条件。

longitude double,

新濠天地 4

SELECT*frommytable1whereidin(selectidfrommytable2);

MaxCompute 与 TableStore 是多个单身的高额总计以及大数据存储服务,所以两个之间的网络必须确定保证连通性。 对于 马克斯Compute 公共云服务拜访 TableStore 存款和储蓄,推荐应用 TableStore 私网 地址,例如

UDTF的优势:

帮衬新的SELECT语序

STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)

新濠天地 5

IN SUBQUERY/NOT IN SUBQUERY

 

斟酌上OpenMLAND的模子都足以映射到上面的推测进度。注意,使用map,reduce,select transform那多少个语法其实语义是同样的,用哪些关键字,哪类写法,不影响平素进度和结果。

回到左表中的数据,当join条件创设,约等于mytable1中某行的id在mytable2的装有id中出现过,此行就保留在结果聚焦

(

或者

INSERT... VALUES... 有一个限制,values必须是常量,不过部分时候希望在插入的多寡中伸开一些简易的演算,今年能够利用马克斯Compute的VALUES TABLE功用,如下:

LOCATION 'tablestore://vehicle-test.cn-shanghai.ots-internal.aliyuncs.com'; -- (5)

新濠天地 6

新濠天地 7

select vid,count(*),avg(speed),avg(oil_consumption) from ots_vehicle_track where vid <4 and gt<1469171387  group by vid;

行使场景举个例子

能够见见,a对应的子查询只要求写二次,在后头重用,CTE的WITH字句中得以钦赐多少个子查询,像使用变量同样在整个讲话中再三重用。除了重用外,也无须再频仍嵌套了。

update_url=

原标题:马克斯Compute重装参加竞赛 第五弹 - SELECT TRANSFO奔驰G级

约等于可以不写from语句,直接推行SELECT,只要SELECT的表明式列表不用别的上游表数据就能够。其底层完成为从五个1行,0列的无名VALUES表选用。那样,在希望测量试验一些函数,比方自身的UDF等,就再也不用手工创制DUAL表了。

TableStore数据类型

MaxCompute数据类型

string

string

binary

blob

int

bigint

double

double

SELECT TRANSFORM 的优势:

可以见到对src读后进行过滤的DAG。对src的读取与过滤在全部推行安顿中只要求叁遍( 注1 )。

WITH SERDEPROPERTIES ( -- (2)

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

0

一种高效、完全托管的TB/PB级数据货仓化解方案,提供多种经文的布满式计算模型,能够更便捷的化解用户海量数据测算问题。

性能

上次向你介绍了复杂类型,从本篇开首,向您介绍马克斯Compute在SQL语言DML方面包车型客车修正

distance double ,

6. 能源文件会被下载到推行钦点命令的行事目录,能够利用文件接口展开./bar.txt文件。

能够看到,顶层的union两边各为二个join,join的左表是平等的查询。通过写子查询的秘技,只好重复这段代码。

DROP TABLE IF EXISTS ots_vehicle_track;

Select transform允许sql用户钦点在服务器上实践一句shell命令,将上游数据各字段用tab分隔,每条记下一行,逐行输入shell命令的stdin,并从stdout读取数据作为出口,送到下游。Shell命令的面目是调用Unix的一部分utility,因而能够运转别的的本子解释器。包括python,java,php,awk,ruby等。

什么样是大数量计算服务 马克斯Compute?

  • SELECT TRANSFORM。

  • 场景1

  • 本人的种类要迁移到马克斯Compute平台上,系统中原本有无数效果是利用脚本来完成的,包涵python,shell,ruby等剧本。 要迁移到马克斯Compute上,我必要把这几个本子全体都退换成UDF/UDAF/UDTF。更改进程不唯有须要消耗费时间间人力,还亟需做三次又二回的测验,进而有限支撑改造成的udf和原先的台本在逻辑上是等价的。作者盼望能有更简约的迁移格局。
  • 场景2
  • SQL比较长于的是会集操作,而自小编急需做的政工要对一条数据做越来越多的鬼斧神工的推断,现存的松手函数不可能平价的落到实处作者想要的职能,而UDF的框架非常不足利索,並且Java/Python笔者都不太熟稔。相比较之下小编更擅长写剧本。小编就希望能够写四个本子,数据全都输入到本人的本子里来,笔者要好来做各个总括,然后把结果输出。而马克斯Compute平台就担当帮小编把多少做好切分,让自个儿的台本能够布满式实行,负担数据的输入表和输出表的军管,肩负JOIN,UNION等涉及操作就好了。

在这之中的VALUES (...), (...) t (a, b), 也就是概念了贰个名叫t,列为a, b的表,类型为(a string, b string),在那之中的花色从VALUES列表中国对外演出公司绎。那样在不希图任何物理表的时候,能够效仿三个有专断数据的,多行的表,并进行任意运算。

// 大家选出来1行多少,并将name/name传入UDF,再次回到多少个string的增加

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

SELECT*frommytable1whereexists(select*frommytable2whereid= mytable1.id);`

条件准备

属性上,SELECT TRANSFORM 与UDTF 工力悉敌。经过两种风貌相比较测量试验,数据量十分的小时,大多数场景下select transform有优势,而数据量大时UDTF有优势。由于transform的支出越发简便易行,所以select transform特别适合做adhoc的数量深入分析。

别的革新

)

地点的语句造出一份有50行的数据表,值是从1到50; 测量试验时候的多寡就足以方便造出来了。功效周围轻易,但原先是odps的三个痛点,未有实惠的办法造数据,就不低价测量检验以及初学者的读书和追究。当然那也足以通过udtf来落实,不过急需复杂的流水生产线:步向ide->写udtf->打包->add jar/python->create function->实践->drop function->drop resource。

例如:

CREATE EXTERNAL TABLE IF NOT EXISTS ots_vehicle_track

新濠天地 8

首先弹 - 善用马克斯Compute编写翻译器的百无一用和警示

https_check=true

新濠天地 9

使用CTE的方法重写以上语句

3.打开bin/odpscmd,输入

责编:澳门新濠天地赌场

热点排行