抑或用map,reduce的要紧字会让逻辑显得清楚一些
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' "
上次向你介绍了CTE,VALUES,SEMIJOIN,本篇向您介绍MaxCompute对其它脚本语言的扶持
UDAF
- Hive
udaf开采入门和周转进程详明 - Hive通用型自定义聚合函数(UDAF卡塔尔
作者:隐林
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
分分28,接下来,在调用时,使用TRANSFORM语法。
SELECT
TRANSFORM (col1, col2)
USING './test.py'
AS (new1, new2)
FORM
test;
这里,我们采纳了AS,钦命输出的若干个列,分别对应到哪个列名。借使省略这句,则Hive会将首个tab前的结果作为key,前面别的作为value。
此地有一个小坑:一时候,大家结合INSERT
OVE酷威WEscortITE使用上述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奥迪Q7RAY等复杂类型,怎么用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>)
下面用的是perl。那实际不独有是言语援救的扩大,一些精短的功能,awk,
python, perl, shell
都帮助直接在指令里面写剧本,不必要写脚本文件,上传财富等进程,开采进度更简便易行。别的,由于当下大家计算集群上尚无php和ruby,所以那三种脚本不支持。
UDTF
- Hive中UDTF编写和采取
运用项景举个例子
Hive Python Streaming的规律及写法
http://www.tuicool.com/articles/vmumUjA
- UDTF是有项目,而Transform的子进度基于stdin/stdout传输数据,全体数据都当做string管理,因而transform多了一步类型转变;
- Transform数据传输看重于操作系统的管道,而眼下管道的buffer唯有4KB,且无法设置,
transform读/写 空/满 的pipe会引致进程被挂起; - UDTF的常量参数能够不用传输,而Transform不可能利用那么些优化。
SELECT TRANSFORM 的优势:
标注
SELECT TRANSFORM 介绍
-
Using
子句钦点的是要进行的通令,而非能源列表,这或多或少和大繁多的马克斯Compute
SQL语法不平等,这么做是为了和hive的语法保持非常。 -
输入从stdin传入,输出从stdout传出;
-
能够安顿分隔符,默许使用 t 分隔列,用换行分隔行;
-
能够自定义reader/writer,但用内置的reader/writer会快相当多
-
行使自定义的财富(脚本文件,数据文件等卡塔 尔(英语:State of Qatar),能够动用 set
odps.sql.session.resources=foo.sh,bar.txt;
来钦赐。能够内定多个resource文件,用逗号隔绝(由此分裂意resource名字中带有逗号和分行卡塔尔国。别的我们还提供了resources子句,能够在using
子句前面钦点 resources ‘foo.sh’, ‘bar.txt’
来钦赐能源,两种格局是等价的(仿照效法“用odps跑测验”的事例卡塔 尔(英语:State of Qatar);
UDTF的优势:
- 惹是生非造数据
马克斯Compute基于ODPS2.0的SQL引擎,提供了SELECT
TRANSFORM成效,能够一览无遗简化对剧本代码的引用,与此同期,也狠抓了质量!我们推荐你尽可能选拔SELECT
TRANSFORM。
其次弹 – 新的为主数据类型与内建函数
-
SELECT TRANSFORM。
-
场景1
- 自己的系统要动员搬迁到MaxCompute平台上,系统中原来有过多功能是采纳脚本来完毕的,包蕴python,shell,ruby等剧本。
要迁移到马克斯Compute上,小编急需把那个本子全体都改换成UDF/UDAF/UDTF。改动进程不仅仅须求耗费时间人力,还索要做贰次又一次的测验,进而保证校勘成的udf和原本的本子在逻辑上是等价的。小编梦想能有更简明的迁移格局。 - 场景2
- SQL相比擅长的是聚众操作,而笔者急需做的事务要对一条数据做更加的多的独具匠心的乘除,现成的内置函数不可能便于的兑现本身想要的成效,而UDF的框架非常不够灵活,而且Java/Python我都不太熟谙。相比较之下笔者更加长于写剧本。小编就希望能够写二个剧本,数据全都输入到自己的台本里来,小编本身来做各类计算,然后把结果输出。而马克斯Compute平台就背负帮笔者把数据做好切分,让自个儿的剧本能够布满式推行,担负数据的输入表和输出表的军事拘押,担任JOIN,UNION等关联操作就好了。
马克斯Compute(原ODPS卡塔尔国是Ali云自己作主研究开发的装有产业界超越水平的分布式大数额管理平台,
尤其在公司内部拿到普遍应用,支撑了三个BU的主题工作。
马克斯Compute除了无休止优化质量外,也从事于提高SQL语言的客户体验和表达技术,升高大范围ODPS开辟者的临蓐力。
- awk 客户会很赏识这些效果
本性上,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。
前段时间odps select transform完全协作了hive的语法、作用和行为,满含input/output row format 以致reader/writer。Hive上的台本,超越四分之二得以平素拿来运作,部分脚本只供给通过轻便更动就能够运营。别的大家不菲效果与利益都用比hive更加高施行功用的语言
(C++) 重构,用以优化品质。
率先弹 – 善用马克斯Compute编写翻译器的谬误和警报
- 子进度和父进程是多个进程,而UDTF是单线程的,假如计算占比比较高,数据吞吐量一点都不大,能够接纳服务器的多核特性
- 数据的传输通过更底层的系统调用来读写,成效比java高
- SELECT
TRANSFORM协理的某个工具,如awk,是natvie代码达成的,和java相比较理论上可能会有总体性优势。
反对上OpenM奇骏的模型都得以映射到下面的乘除进程。注意,使用map,reduce,select
transform那几个语法其实语义是相近的,用哪些关键字,哪种写法,不影响平素进程和结果。
正文为云栖社区原创内容,未经允许不得转载。归来腾讯网,查看更加多
上述意义能够选拔SELECT TRANSFORM来促成