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 脚本的对比:
相关推荐
【Hive性能优化及Hive3新特性】 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,常用于大规模数据处理和分析。本章节主要探讨如何优化Hive的性能,以及Hive3引入的新特性。 1. **分区表与分桶表优化** ...
开发者通常需要这些jar包来创建自定义的Hive UDF(用户自定义函数)或UDAF(用户自定义聚合函数)以扩展Hive的功能。这些jar包也用于在MapReduce、Tez或Spark等计算框架上运行Hive查询。 在Hive的不同版本之间,jar...
6. **存储过程(UDF,UDAF,UDTF)**:Hive支持用户自定义函数(UDF),用户定义聚合函数(UDAF)和用户定义表生成函数(UDTF),允许扩展Hive的功能。 7. **连接Hadoop生态系统**:Hive与Hadoop生态系统的其他组件...
华为大数据认证:Hive分布式数据仓库课程目标是让学员掌握Hive应用场景与基本原理、掌握FusionInsight中Hive增强特性、熟悉常用Hive SQL语句。课程目录包括Hive概述、Hive功能与架构、Hive基本操作等。 Hive是大...
在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...
2. **Hive 2.5.15的关键特性** - **性能提升**:这个版本可能包含了一些性能优化,例如查询执行速度更快,内存管理更有效。 - **SQL兼容性**:Hive 2.5.15继续增强对ANSI SQL标准的支持,使得SQL开发者更容易上手...
标题 "jdbc连接hive的jar包" 涉及的关键知识点主要集中在Hive的JDBC连接以及相关依赖的Java库上。Hive是一个基于Hadoop的数据仓库...同时,了解Hive的元数据存储、分区策略、表类型等特性也对有效使用Hive至关重要。
4. **Hive的ACID特性**:从Hive 3.0版本开始,Hive支持事务(transaction)、原子性(atomicity)、一致性(consistency)和隔离性(isolation)特性,提高了数据处理的可靠性。 5. **Hive与其它大数据组件的协同**...
3. **创建Hive SQL的Antlr4语法规则**:根据Hive SQL的语法特性,编写对应的Antlr4语法规则文件(通常以.g4为扩展名)。 4. **实现解析器**:利用Antlr4生成的解析器类,处理输入的Hive SQL语句,构建并遍历AST,以...
1. **超大数据集的计算与扩展能力**:Hive基于Hadoop的MapReduce框架运行,这意味着它具备处理PB级数据的能力,并且可以水平扩展到数千个节点。 2. **SQL-like查询语言**:HiveQL提供了一种接近于标准SQL的语法,使...
- **弹性扩展性**:基于 Hadoop,Hive 具有很好的水平扩展性,能够处理 PB 级别的数据。 - **数据分区和桶**:通过数据分区和桶,可以提高查询效率,尤其是在处理大数据时。 - **容错性**:Hive 的计算任务是分布式...
3. **可扩展性**:Hive 构建在 Hadoop 上,能够利用 Hadoop 集群的计算和存储能力,轻松扩展到处理PB级别的数据。 4. **容错性**:Hive 的作业都是通过 MapReduce 运行的,因此天然具备了 Hadoop 的容错性,当某个...
Hive 1.2.1 的主要特性包括: 1. **SQL 支持**:HiveQL (Hive Query Language) 是一种类似于 SQL 的查询语言,使熟悉 SQL 的用户能够轻松地对大数据进行操作,无需学习新的编程语言。 2. **元数据管理**:Hive ...
4. **视图与UDF**: 视图简化了复杂查询,而用户自定义函数(UDF)允许用户扩展Hive的功能。 5. **Hive与Hadoop的交互**: 了解如何在Hadoop集群上部署和配置Hive,以及如何通过HDFS交互数据。 **Hive从入门到精通** ...
1. 扩展性:Hive能够轻松扩展到数千个节点,处理PB级别的数据。 2. 易用性:HiveQL使得非程序员可以编写查询,简化了大数据分析的门槛。 3. 灵活性:支持多种数据格式,如文本、Avro、Parquet等,且能处理结构化和半...
综上所述,集成 Flink 1.12.0 和 Hive 3.1.2 需要正确配置依赖和参数,使用 Table API 或 SQL 进行数据操作,并理解如何利用 Flink 的高级特性如 CEP 来扩展你的大数据处理能力。同时,确保你的开发环境和生产环境都...
6. **存储过程**:允许用户定义自定义函数(UDF, User Defined Function)和复杂的操作,扩展 Hive 的功能。 7. **高可用性**:Hive Server 和 Metastore 可以配置为多实例,以提高服务的可靠性。 8. **安全特性**...
- **高度可扩展性**: 用户可以通过自定义数据类型、函数等方式扩展Hive的功能。 - **与Hadoop生态系统的无缝集成**: 支持多种数据源和数据格式,如HDFS、HBase等。 #### 二、Hive的优势 - **高性能处理**: Hive...
Hive的主要优点在于它的易用性和可扩展性,使得非程序员也能方便地进行数据操作。在`apache-hive-2.3.6-bin.tar.gz`中,包含了Hive的源代码、二进制文件、配置文件和相关的文档,这使得用户能够搭建并运行Hive服务。...