Hive 随谈(六)– Hive 的扩展特性

Hive 是一个很开放的系统,很多内容都支持用户定制,包括:

文件格式:Text File,Sequence File 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text 用户提供的 map/reduce 脚本:不管什么语言,利用 stdin/stdout 传输数据 用户自定义函数: Substr, Trim, 1 – 1 用户自定义聚合函数: Sum, Average…… n – 1 File FormatTextFileSequenceFIleRCFFileData typeText OnlyText/BinaryText/BinaryInternal Storage OrderRow-basedRow-basedColumn-basedCompressionFile BasedBlock BasedBlock BasedSplitableYESYESYESSplitable After CompressionNoYESYES CREATE TABLE mylog ( user_id BIGINT, page_url STRING, unix_time INT) STORED AS TEXTFILE;

当用户的数据文件格式不能被当前 Hive 所识别的时候,可以自定义文件格式。可以参考 contrib/src/java/org/apache/hadoop/hive/contrib/fileformat/base64 中的例子。写完自定义的格式后,在创建表的时候指定相应的文件格式就可以:

CREATE TABLE base64_test(col1 STRING, col2 STRING) STORED AS INPUTFORMAT 'org.apache.hadoop.hive.contrib. fileformat.base64.Base64TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.contrib. fileformat.base64.Base64TextOutputFormat';SerDe

SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。序列化的格式包括:

分隔符(tab、逗号、CTRL-A) Thrift 协议

反序列化(内存内):

Java Integer/String/ArrayList/HashMap Hadoop Writable 类 用户自定义类

目前存在的 Serde 见下图:

其中,LazyObject 只有在访问到列的时候才进行反序列化。 BinarySortable:保留了排序的二进制格式。

当存在以下情况时,可以考虑增加新的 SerDe:

用户的数据有特殊的序列化格式,当前的 Hive 不支持,而用户又不想在将数据加载至 Hive 前转换数据格式。 用户有更有效的序列化磁盘数据的方法。

用户如果想为 Text 数据增加自定义 Serde ,可以参照 contrib/src/java/org/apache/hadoop/hive/contrib/serde2/RegexSerDe.java 中的例子。RegexSerDe 利用用户提供的正则表倒是来反序列化数据,例如:

CREATE TABLE apache_log( host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s";) STORED AS TEXTFILE;

用户如果想为 Binary 数据增加自定义的 SerDE,可以参考例子:serde/src/java/org/apache/hadoop/hive/serde2/binarysortable,例如:

CREATE TABLE mythrift_table ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.thrift.ThriftSerDe' WITH SERDEPROPERTIES ( "serialization.class" = "com.facebook.serde.tprofiles.full", "serialization.format" = "com.facebook.thrift.protocol.TBinaryProtocol";);Map/Reduce 脚本(Transform)

用户可以自定义 Hive 使用的 Map/Reduce 脚本,比如:

FROM ( SELECT TRANSFORM(user_id, page_url, unix_time) USING 'page_url_to_id.py' AS (user_id, page_id, unix_time) FROM mylog DISTRIBUTE BY user_id SORT BY user_id, unix_time) mylog2 SELECT TRANSFORM(user_id, page_id, unix_time) USING 'my_python_session_cutter.py' AS (user_id, session_info);

Map/Reduce 脚本通过 stdin/stdout 进行数据的读写,调试信息输出到 stderr。

UDF(User-Defined-Function)

用户可以自定义函数对数据进行处理,例如:

add jar build/ql/test/test-udfs.jar; CREATE TEMPORARY FUNCTION testlength AS 'org.apache.hadoop.hive.ql.udf.UDFTestLength'; SELECT testlength(src.value) FROM src; DROP TEMPORARY FUNCTION testlength;

UDFTestLength.java 为:

package org.apache.hadoop.hive.ql.udf; public class UDFTestLength extends UDF { public Integer evaluate(String s) { if (s == null) { return null; } return s.length(); } }

自定义函数可以重载:

add jar build/contrib/hive_contrib.jar; CREATE TEMPORARY FUNCTION example_add AS 'org.apache.hadoop.hive.contrib.udf.example.UDFExampleAdd'; SELECT example_add(1, 2) FROM src; SELECT example_add(1.1, 2.2) FROM src;

UDFExampleAdd.java:

public class UDFExampleAdd extends UDF { public Integer evaluate(Integer a, Integer b) { if (a = null || b = null) return null; return a + b; } public Double evaluate(Double a, Double b) { if (a = null || b = null) return null; return a + b; } }

%%

在使用 UDF 的时候,会自动进行类型转换,这个 java 或者 C 中的类型转换有些类似,比如:

SELECT example_add(1, 2.1) FROM src;

的结果是 3.1,这是因为 UDF 将类型为 Int 的参数 “1″ 转换为 double。

类型的隐式转换是通过 UDFResolver 来进行控制的,并且可以根据不同的 UDF 进行不同的控制。

UDF 还可以支持变长的参数,例如 UDFExampleAdd.java:

public class UDFExampleAdd extends UDF { public Integer evaluate(Integer... a) { int total = 0; for (int i=0; i<a.length; i++) if (a[i] != null) total += a[i]; return total; } // the same for Double public Double evaluate(Double... a) }

使用例子为:

SELECT example_add(1, 2) FROM src; SELECT example_add(1, 2, 3) FROM src; SELECT example_add(1, 2, 3, 4.1) FROM src;

综上,UDF 具有以下特性:

用 java 写 UDF 很容易。 Hadoop 的 Writables/Text 具有较高性能。 UDF 可以被重载。 Hive 支持隐式类型转换。 UDF 支持变长的参数。 genericUDF 提供了较好的性能(避免了反射)。 UDAF(User-Defined Aggregation Funcation)

例子:

SELECT page_url, count(1), count(DISTINCT user_id) FROM mylog;

UDAFCount.java:

public class UDAFCount extends UDAF { public static class Evaluator implements UDAFEvaluator { private int mCount; public void init() { mcount = 0; } public boolean iterate(Object o) { if (o!=null) mCount++; return true; } public Integer terminatePartial() { return mCount; } public boolean merge(Integer o) { mCount += o; return true; } public Integer terminate() { return mCount; } }

UDAF 总结:

编写 UDAF 和 UDF 类似 UDAF 可以重载 UDAF 可以返回复杂类 在使用 UDAF 的时候可以禁止部分聚合功能

UDF,UDAF 和 MR 脚本的对比:

时间: 2015-03-12
Tags: java, 可以, user

Hive 随谈(六)– Hive 的扩展特性的相关文章

Hive 随谈(一)– Hive 入门

Hive 是什么 在接触一个新的事物首先要回到的问题是:这是什么? 这里引用 Hive wiki 上的介绍: Hive is a data warehouse infrastructure built on top of Hadoop. It provides tools to enable easy data ETL, a mechanism to put structures on the data, and the capability to querying and analysis o

最新版本的Hive 0.13发布,增加ACID特性

近日发布的Hive 0.13中采用了ACID语义的事务机制,在分区层保证事务原子性.一致性和持久性,并通过开启Zoohttp://www.aliyun.com/zixun/aggregation/19458.html">Keeper或内存中的锁机制保证事务隔离性.数据流摄取.缓慢变化维.数据重述这些新的用例在新版本中成为了可能,当然新版Hive中也还存在一些不足,Hive新版本具体带来哪些改变呢?作者Alan Gates为我们带来了精彩分析. 什么是ACID,有什么作用? ACID代表数据

Hive 随谈(四)– Hive QL

Hive 的官方文档中对查询语言有了很详细的描述,请参考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项. Create TableCREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comm

Hive简介、什么是Hive、为什么使用Hive、Hive的特点、Hive架构图、Hive基本组成、Hive与Hadoop的关系、Hive与传统数据库对比、Hive数据存储(来自学习资料)

1.1 Hive简介 1.1.1   什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.1.2   为什么使用Hive Ø  直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大   Ø  为什么要使用Hive 操作接口采用类SQL语法,提供快速开发的能力. 避免了去写MapReduce,减少开发人员的学习成本. 功能扩展很方便. 1.1.3   H

CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)

CSS3在CSS2.1的基础上新增加了许多属性,这里选择了较常用的一些功能与大家分享,帮助文档中有很详细的描述,可以在本文的示例中获得帮助文档. 一.阴影 1.1.文字阴影 text-shadow<length>①: 第1个长度值用来设置对象的阴影水平偏移值.可以为负值 <length>②: 第2个长度值用来设置对象的阴影垂直偏移值.可以为负值 <length>③: 如果提供了第3个长度值则用来设置对象的阴影模糊值.不允许负值 <color>: 设置对象的阴

浅谈XHTML(可扩展HTML)标准中CDATA

xhtml|标准 近来,随着XHTML(可扩展HTML)标准的出现,<script/>标签也经历了一些改变.该标签不再用language特性,而用type特性声明内嵌代码或要加入的外部文件的mime类型,JavaScript的mime类型是"text/javascript".例如: <html>  <head>  <title>Title of Page</title>  <script type="text/

c#v2.0 扩展特性 翻译(1)

Introduction to C# 2.0C# 2.0 introduces several language extensions, the most important of which are Generics, Anonymous Methods, Iterators, and Partial Types. C#2.0 介绍几种语言扩展,泛型,匿名方法,迭代器 和.partial Types. · Generics permit classes, structs, interfaces

Julien Nioche谈Apache Nutch 2的特性及产品路线图

原文地址: http://www.infoq.com/cn/articles/nioche-apache-nutch2 开源的Web搜索框架Apache Nutch的2.1版本已于2012年10月5日发布,该版本的新特性包括:支持一些改进属性,用于更好地配置Solr:更新到各个Gora依赖:可以选择构建弹性搜索中的索引.Nutch既可以运行在单台服务器上,也可以用作大规模抓取平台运行在Hadoop集群上. Nutch框架的2.0版本在经历了两年开发之后,已于今年7月发布,该版本以Apache G

【LINQ技术】扩展特性和LINQ操作符

LINQ特有的编程结构 LINQ就像是嵌入到C#中的强类型查询语言,尽管和SQL查询很像,但语法却并不相同,甚至还有截然相反的一面. LINQ是在.NET发展到3.5版的时候被引进的,C#和VB语言都为此做了许多工作,扩展了大量新的编程结构. 一.隐式类型本地变量 var--一个如此小巧的关键字却有着强大的力量. var varInt=1; var varBool=True; var varString="String, String, String"; Console.WriteLi