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

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 脚本的对比:

分享到:
评论

相关推荐

    第6章:Hive性能优化及Hive3新特性1

    【Hive性能优化及Hive3新特性】 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,常用于大规模数据处理和分析。本章节主要探讨如何优化Hive的性能,以及Hive3引入的新特性。 1. **分区表与分桶表优化** ...

    HIVE相关的jar包

    开发者通常需要这些jar包来创建自定义的Hive UDF(用户自定义函数)或UDAF(用户自定义聚合函数)以扩展Hive的功能。这些jar包也用于在MapReduce、Tez或Spark等计算框架上运行Hive查询。 在Hive的不同版本之间,jar...

    apache-hive-2.3.9-bin.tar大数据HIVE.zip

    6. **存储过程(UDF,UDAF,UDTF)**:Hive支持用户自定义函数(UDF),用户定义聚合函数(UDAF)和用户定义表生成函数(UDTF),允许扩展Hive的功能。 7. **连接Hadoop生态系统**:Hive与Hadoop生态系统的其他组件...

    华为大数据认证: Hive分布式数据仓库.pptx

    华为大数据认证:Hive分布式数据仓库课程目标是让学员掌握Hive应用场景与基本原理、掌握FusionInsight中Hive增强特性、熟悉常用Hive SQL语句。课程目录包括Hive概述、Hive功能与架构、Hive基本操作等。 Hive是大...

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    hive jdbc驱动 2.5.15 及 2.6.1两个版本

    2. **Hive 2.5.15的关键特性** - **性能提升**:这个版本可能包含了一些性能优化,例如查询执行速度更快,内存管理更有效。 - **SQL兼容性**:Hive 2.5.15继续增强对ANSI SQL标准的支持,使得SQL开发者更容易上手...

    jdbc连接hive的jar包

    标题 "jdbc连接hive的jar包" 涉及的关键知识点主要集中在Hive的JDBC连接以及相关依赖的Java库上。Hive是一个基于Hadoop的数据仓库...同时,了解Hive的元数据存储、分区策略、表类型等特性也对有效使用Hive至关重要。

    大数据系列-Hive

    4. **Hive的ACID特性**:从Hive 3.0版本开始,Hive支持事务(transaction)、原子性(atomicity)、一致性(consistency)和隔离性(isolation)特性,提高了数据处理的可靠性。 5. **Hive与其它大数据组件的协同**...

    基于 Antlr4 的 Hive SQL 解析.zip

    3. **创建Hive SQL的Antlr4语法规则**:根据Hive SQL的语法特性,编写对应的Antlr4语法规则文件(通常以.g4为扩展名)。 4. **实现解析器**:利用Antlr4生成的解析器类,处理输入的Hive SQL语句,构建并遍历AST,以...

    hive编程入门课程

    1. **超大数据集的计算与扩展能力**:Hive基于Hadoop的MapReduce框架运行,这意味着它具备处理PB级数据的能力,并且可以水平扩展到数千个节点。 2. **SQL-like查询语言**:HiveQL提供了一种接近于标准SQL的语法,使...

    apache-hive-2.3.7-bin.tar.gz

    - **弹性扩展性**:基于 Hadoop,Hive 具有很好的水平扩展性,能够处理 PB 级别的数据。 - **数据分区和桶**:通过数据分区和桶,可以提高查询效率,尤其是在处理大数据时。 - **容错性**:Hive 的计算任务是分布式...

    apache-hive-2.1.1-bin.tar.gz

    3. **可扩展性**:Hive 构建在 Hadoop 上,能够利用 Hadoop 集群的计算和存储能力,轻松扩展到处理PB级别的数据。 4. **容错性**:Hive 的作业都是通过 MapReduce 运行的,因此天然具备了 Hadoop 的容错性,当某个...

    apache-hive-1.2.1-bin.tar.gz

    Hive 1.2.1 的主要特性包括: 1. **SQL 支持**:HiveQL (Hive Query Language) 是一种类似于 SQL 的查询语言,使熟悉 SQL 的用户能够轻松地对大数据进行操作,无需学习新的编程语言。 2. **元数据管理**:Hive ...

    Hive编程指南+HIVE从入门到精通+Hive高级编程+Apache Oozie

    4. **视图与UDF**: 视图简化了复杂查询,而用户自定义函数(UDF)允许用户扩展Hive的功能。 5. **Hive与Hadoop的交互**: 了解如何在Hadoop集群上部署和配置Hive,以及如何通过HDFS交互数据。 **Hive从入门到精通** ...

    Hadoop Hive

    1. 扩展性:Hive能够轻松扩展到数千个节点,处理PB级别的数据。 2. 易用性:HiveQL使得非程序员可以编写查询,简化了大数据分析的门槛。 3. 灵活性:支持多种数据格式,如文本、Avro、Parquet等,且能处理结构化和半...

    flink1.12.0集成或者连接hive3.1.2的依赖包

    综上所述,集成 Flink 1.12.0 和 Hive 3.1.2 需要正确配置依赖和参数,使用 Table API 或 SQL 进行数据操作,并理解如何利用 Flink 的高级特性如 CEP 来扩展你的大数据处理能力。同时,确保你的开发环境和生产环境都...

    apache-hive-2.0.0

    6. **存储过程**:允许用户定义自定义函数(UDF, User Defined Function)和复杂的操作,扩展 Hive 的功能。 7. **高可用性**:Hive Server 和 Metastore 可以配置为多实例,以提高服务的可靠性。 8. **安全特性**...

    Hive开发培训.pptx

    - **高度可扩展性**: 用户可以通过自定义数据类型、函数等方式扩展Hive的功能。 - **与Hadoop生态系统的无缝集成**: 支持多种数据源和数据格式,如HDFS、HBase等。 #### 二、Hive的优势 - **高性能处理**: Hive...

    hive&tez.zip

    Hive的主要优点在于它的易用性和可扩展性,使得非程序员也能方便地进行数据操作。在`apache-hive-2.3.6-bin.tar.gz`中,包含了Hive的源代码、二进制文件、配置文件和相关的文档,这使得用户能够搭建并运行Hive服务。...

Global site tag (gtag.js) - Google Analytics