`

Hive 注意事项与扩展特性

 
阅读更多
1. 使用HIVE注意点

字符集
Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用。
备注:中文数据load到表里面,,如果字符集不同,很有可能全是乱码需要做转码的,但是hive本身没有函数来做这个。

压缩
hive.exec.compress.output 这个参数,默认是false,但是很多时候貌似要单独显式设置一遍,否则会对结果做压缩的,如果你的这个文件后面还要在hadoop下直接操作,那么就不能压缩了。

count(distinct)
当前的Hive不支持在一条查询语句中有多Distinct。如果要在Hive查询语句中实现多Distinct,需要使用至少n+1条查询语句(n为distinct的数目),前n条查询分别对n个列去重,最后一条查询语句对n个去重之后的列做Join操作,得到最终结果。

JOIN
只支持等值连接

DML操作
只支持INSERT/LOAD操作,无UPDATE和DELTE

HAVING
不支持HAVING操作。如果需要这个功能要嵌套一个子查询用where限制

子查询
Hive不支持where子句中的子查询

Join中处理null值的语义区别
SQL标准中,任何对null的操作(数值比较,字符串操作等)结果都为null。Hive对null值处理的逻辑和标准基本一致,除了Join时的特殊逻辑。这里的特殊逻辑指的是,Hive的Join中,作为Join key的字段比较,null=null是有意义的,且返回值为true。

分号字符
分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:
select concat(cookie_id,concat(';',’zoo’)) from c02_clickstat_fatdt1 limit 2;
FAILED: Parse Error: line 0:-1 cannot recognize input '<EOF>' in function specification


可以推断,Hive解析语句的时候,只要遇到分号就认为语句结束,而无论是否用引号包含起来。
解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:
select concat(cookie_id,concat('\073','zoo')) from c02_clickstat_fatdt1 limit 2;


为什么是八进制ASCII码?我尝试用十六进制的ASCII码,但Hive会将其视为字符串处理并未转义,好像仅支持八进制,原因不详。这个规则也适用于其他非SELECT语句,如CREATE TABLE中需要定义分隔符,那么对不可见字符做分隔符就需要用八进制的ASCII码来转义。
Insert
根据语法Insert必须加“OVERWRITE”关键字,也就是说每一次插入都是一次重写

2. Hive的扩展特性

Hive 是一个很开放的系统,很多内容都支持用户定制,包括:
* 文件格式:Text File,Sequence File 
* 内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text 
* 用户提供的map/reduce脚本:不管什么语言,利用stdin/stdout传输数据 
* 用户自定义函数:Substr, Trim, 1 – 1 
* 用户自定义聚合函数:Sum, Average…… n – 1


2.1 数据文件格式



例如使用文件格式存储创建的表:
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';


2.2 SerDe
SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
序列化的格式包括:分隔符(tab、逗号、CTRL-A)、Thrift 协议。
反序列化(内存内):Java Integer/String/ArrayList/HashMap、Hadoop Writable类、用户自定义类。

其中,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";);


2.3 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。

2.4 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();
  }
}


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


2.5 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;
  }
}


转自:http://blog.csdn.net/lnho2015/article/details/51418125

  • 大小: 18.9 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    hive jdbc驱动 2.5.15 及 2.6.1两个版本

    5. **使用注意事项** - **配置**:正确配置Hive JDBC驱动的JDBC URL、用户名和密码,确保连接成功。 - **版本兼容性**:确保驱动版本与Hive服务端版本匹配,避免兼容性问题。 - **安全考虑**:使用SSL加密连接以...

    apache-hive-1.2.1

    使用Hive时,开发者和数据分析师需要注意的事项包括: - 配置Hive的metastore,它是元数据的存储库,包含了表结构、分区信息等。 - 根据业务需求选择合适的存储格式,如TextFile、ORC、Parquet等,每种格式都有其优...

    Hive指南.docx

    #### 五、Hive的运维注意事项 1. **元数据管理**:推荐使用独立的数据库来存储 Hive 的元数据,确保数据的安全性和一致性。 2. **表设计**:合理设计表的分区和键,以便于提高查询性能。 3. **数据分布**:根据业务...

    hive操作指南

    ### Hive操作指南知识点详解 ...以上是对“Hive操作指南”的详细介绍,包括Hive的架构、基本操作、高级特性以及使用注意事项等内容。通过这些内容的学习,可以帮助开发者更好地理解和使用Hive进行数据分析和处理。

    DolphinScheduler+海豚

    #### 四、注意事项 - 在进行Jar包替换前,务必确保新版本的Hive Jar包与当前Hadoop集群版本兼容。 - 替换过程中,注意备份原有的Jar包,以便在出现问题时能够快速恢复。 - 确保在所有相关服务器上都执行了相同的...

    hadoop2.6.3-spark1.5.2-hbase-1.1.2-hive-1.2.1-zookeeper-3.4.6安装指南

    以上是搭建Hadoop 2.6.3、Spark 1.5.2、HBase 1.1.2、Hive 1.2.1和Zookeeper 3.4.6集成环境的基本步骤和注意事项,每个环节都需要仔细操作,确保集群稳定运行。在实际环境中,还可能涉及更多高级特性,如安全性设置...

    CDH6.3.2之升级spark-3.3.1.doc

    ### CDH6.3.2升级Spark至3.3.1详细步骤与注意事项 #### 一、背景介绍 在CDH6.3.2中,默认的Spark版本为2.4.0。为了满足更高的性能需求及功能扩展,本文将详细介绍如何将Spark升级至3.3.1版本的过程。此次升级的...

    阿里云 专有云企业版 V3.8.0 云数据库 HBase 技术白皮书 20190621.pdf

    阿里云专有云企业版V3.8.0的云数据库HBase技术白皮书是针对阿里云HBase产品的一份详细技术文档,旨在提供关于该服务的技术特性、应用场景、优势以及使用注意事项的全面介绍。HBase是一款基于Apache HBase的分布式、...

    Arduino万能板电路原理图和PCB工程文件

    5. "使用说明.txt":这是一个文本文件,可能包含关于如何使用这些文件、安装注意事项、设计细节或其他重要提示的信息。 综上所述,这个压缩包包含了一套完整的Arduino万能板设计资源,涵盖了从原理图设计到PCB布局...

    phoenix.zip

    6. **与Apache Hive和Pig的集成**:可以通过Hive和Pig来访问HBase数据,进一步拓宽了使用场景。 **应用场景:** 1. **实时分析**:对于需要实时分析的海量半结构化数据,Phoenix提供了高效的数据查询能力。 2. **...

    CDH5.12&CDH6.0安装文档.zip

    5. **安装注意事项**:CDH6.0不兼容CDH5.12,升级前需备份数据,且不能直接平滑升级。 三、学习与交流 这些安装文档不仅适用于初次安装,也适用于集群扩展和故障排查。通过学习这些文档,你可以掌握大数据集群的...

    35套选择题目:大数据架构、高性能、数据治理题目.docx

    - **注意事项**:在处理用户行为数据时,需要注意埋点数据的业务流程一致性、与其他数据源的一致性和关联性、元数据字段化保存以及埋点数据的可视化与非可视化区分。 #### 大数据存储及并行处理 - **存储系统选择**...

    Hbase中文文档和官方英文文档PDF.7z

    8. **扩展与集成**:介绍与其他系统(如Hadoop、Hive、Spark)的集成方法。 **Hbase官方英文文档**: 官方文档是最权威的信息来源,通常包括最新版本的特性和更新。以下是一些关键章节: 1. **Introduction**:...

    Ambari2.7.5&HDP3.1.5.txt.zip

    在 Ambari2.7.5&HDP3.1.5.txt 文件中,通常会包含详细的安装指南、配置参数和注意事项,帮助用户顺利完成集群搭建。 总之,Ambari 2.7.5 和 HDP 3.1.5 的结合为大数据环境的管理和运维提供了一个强大的工具集,让...

    Apache Superset数据探查与可视化平台 v0.38.1-源码.zip

    "使用前必看.htm"可能包含使用源码的注意事项或安装指南,"内容来自存起来软件站www.cqlsoft.com.txt"可能是对软件来源的说明,而".url"文件是快捷方式,可能指向有关Superset的更多信息资源。学习源码的过程中,...

    hivezzy:添加partition支持正则表达式

    5. **文档更新**:为了帮助用户理解和使用新功能,`hivezzy`项目应该提供详细的文档,解释如何编写正则表达式查询,以及性能和使用上的注意事项。 6. **社区支持与维护**:由于`hivezzy`是开源项目,其成功也依赖于...

    Impala

    此外,提供的`readme.html`和`readme.txt`通常包含了项目的介绍、安装指南和使用注意事项。`jsdoc`可能包含Impala的API文档,对于开发自定义工具或集成Impala功能非常有用。`lib`目录则可能包含Impala的库文件,是其...

    毕业设计:基于spark的外卖大数据平台分析系统.zip

    5. `README.md` - 项目介绍、运行指南和注意事项。 6. `build.gradle` 或 `build.sbt` - 如果项目使用Gradle或SBT构建工具,分别对应各自的配置文件。 这个项目可能会涉及以下几个核心概念和技术: - **Spark Core*...

Global site tag (gtag.js) - Google Analytics