`
xiaobian
  • 浏览: 581250 次
  • 来自: 北京
社区版块
存档分类
最新评论

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 Format

  TextFile SequenceFIle RCFFile
Data type Text Only Text/Binary Text/Binary
Internal Storage Order Row-based Row-based Column-based
Compression File Based Block Based Block Based
Splitable YES YES YES
Splitable After Compression No YES YES
  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 脚本的对比:

分享到:
评论

相关推荐

    完整图文版 阿里巴巴数据产品平台 大数据与云计算技术系列教程 Hadoop之Hive学习笔记(共63页).pdf

    由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发。 2. 数据存储位置。Hive 是建立在 Hadoop 之上的,所有 Hive ...

    基于Spark+Hive实现用户画像分析系统(含价值度、忠诚度、流失预警、活跃度等分析模型).zip

    在未来,我计划继续深入学习Spark和Spring Boot,扩展我的技术栈,提高自己的技能水平。我希望能够运用所学到的知识解决实际问题,并在项目中发挥作用。此外,我也希望能够不断拓宽自己的技术视野,学习其他相关的...

    漂亮的嫩黄瓜「Pretty Gherkin」-crx插件

    安装扩展2.勾选“允许访问文件URL”复选框(重要)支持支持本地特性文件和原始文件: - Github - Gitlab - Bitbucket.org通过支持链接和任何支持麻烦的标记-向上。支持的功能文件标记&gt;标题格式(功能/背景/场景)...

    Hadoop权威指南 第二版(中文版)

    MapReduce的特性;如何构建Hadoop集群,如何管理Hadoop;Pig简介;Hbase简介;Hive简介;ZooKeeper简介;开源工具Sqoop,最后还提供了丰富的案例分析。  本书是Hadoop权威参考,程序员可从中探索如何分析海量数据集...

    Hadoop权威指南(中文版)2015上传.rar

    第8章 MapReduce的特性 计数器 内置计数器 用户定义的Java计数器 用户定义的Streaming计数器 排序 准备 部分排序 总排序 二次排序 联接 map端联接 reduce端联接 边数据分布 利用JobConf来配置作业 分布式缓存 ...

    Hbase 二级索引方案

    的查询,往往是要通过类似 Hive、Pig 等系统进行全表的 MapReduce 计算,这种方式既浪费 了机器的计算资源,又因高延迟使得应用黯然失色。于是,针对 HBase Secondary Indexing 的方案出现了。 Solr Solr 是一个...

    大数据与人工智能-fy.docx

    是JAVA实现的、分布式的、可横向扩展的文件系统 B.支持数据切块,目的是提升文件的读取效率 C.数据切块后默认大小为256M(正确答案) D.有副本机制 答案解析:为128M 12. Yarn是从Hadoop的哪个版本出现的 [单选题] A....

    hadoop权威指南 第三版 英文版

    Pig, Hive, Sqoop, and ZooKeeper这几个框架的最新版的特性和修改都有扩展介绍。 这本书还有许多修改和提高。 原文: Third Edition The third edition is due to be published in May 2012. You can pre-...

    word源码java-exchange-parent:数据交换

    exchange是要打造一个轻量级,高扩展性的数据交换平台,支持对结构化及无结构化的异构数据源之间的数据传输,在应用层上具有数据权限管控、节点服务高可用和多租户资源隔离等业务特性,而在数据层上又具有传输架构...

    R的极客理想:工具篇,完整扫描版

    , 【名家推荐】, “近几年出版的关于R语言的书籍主要从统计学知识或编程语法等角度来写,张丹的《R的极客理想》以作者多年开发经验为素材,从工程角度描述了R语言的诸多让人兴奋的特性,以及R语言同其他主流开发环境...

    PiFlow大数据流水线系统-其他

    特性: 1、简单易用 可视化配置流水线。 监控流水线。 查看流水线日志。 检查点功能。 2、扩展性强: 支持自定义开发数据处理组件。 3、性能优越: 基于分布式计算引擎Spark开发。 4、功能强大: 提供100+的数据处理...

    大数据基础知识入门.pdf

    支 持 大 多 数 Hadoop 组 件 , 包 括 HDFS 、 MapReduce 、 Spark 、 Hive 、 Pig 、 Hbase 、 Zookeper、Sqoop等 大数据集群管理方式 分 为 手 工 方 式 ( Apache hadoop)和工具方式(Ambari + hdp 和 ...

    大数据工程师学习计划.pdf

    由于数据增长速度快,数据存储就必须可以⽔平扩展。 数据存储之后,该如何通过运算快速转化成⼀致的格式,该如何快速运算出⾃⼰想要的结果? 对应的MapReduce这样的分布式运算框架解决了这个问题;但是写MapReduce...

    云计算第二版

    3.2.1 EC2的主要特性 97 3.2.2 EC2基本架构及主要概念 97 3.2.3 EC2的关键技术 99 3.3.4 EC2安全及容错机制 101 3.3 简单存储服务S3 102 3.3.1 基本概念和操作 102 3.3.2 数据一致性模型 104 3.3.3 S3安全措施 105 ...

    antlr4权威指南

    Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR;Lex Machina将ANTLR用于分析法律文本;Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR;NetBeans公司的IDE使用ANTLR来解析C++;...

Global site tag (gtag.js) - Google Analytics