Hive简介

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

建立Hive表

hive中创建表时,默认情况下hive负责管理数据,这就是所谓的“托管表”。建立托管表的语法比较简单,和写SQL建表也比较类似:

DROP TABLE example_table;
CREATE TABLE if not exists example_table(example_id STRING, example_name STRING ) row format delimited fields terminated by ',';

需要注意的是,建立字段的定义,以及row的delimeter,这里指定为”,”。

托管表建立完成后,表中并无数据,这就需要我们向表中插入一些数据。但Hive中并不可以通过insert一条数据的方式向表中插入数据,可以通过下面的方式从本地文件中加载(当然也可以从HDFS中加载,语法稍微不同):

LOAD DATA LOCAL INPATH 'LocalFile' OVERWRITE INTO TABLE region_table;

由于在第一步中我们已经设定行分隔符为’,’,这里的LocalFile的每一行都要由,进行分隔,并在加载完成后,对应到定义的字段中去。

但在我们的实际应用场景下,Hive中使用的数据大部分都是从外部文件中得到的,这时候就需要创建“外部表”。

drop table task_table;
create external table if not exists task_table
( doc string )
stored as
inputformat 'Hive进行的InputFormat转换'
outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
location '/数据所在的HDFS文件夹/';

使用external关键字之后,Hive就知道数据并不是托管的,不会将数据移到自己的数据仓库目录中;而且在drop外部表时,也不会碰数据,只会删除hive中的元数据。

InputFormat

和Hadoop中的InputFormat类似,我们在定义外部表时,需要指定特定的InputFormat以将HDFS上的文件按行映射到对应的数据上去。但是,我们在CREATE外部表语句中定义的InputFormat与Hadoop中Map使用的InputFormat有所不同,外部表中的定义的InputFormat并不能决定map分片数量。

在hive中运行“select * from example_table”时直接返回当前所有值,并不会启动mapreduce任务,而当构建一些复杂的特殊的HQL语句时,就会启动一个mapreduce任务来进行处理。

hive中运行参数的设置可以通过hive命令中的“--hive-conf 参数名=参数值”来定义,在hive启动的mapreduce任务中,使用的默认是org.apache.hadoop.hive.ql.io.CombineHiveInputFormat类,与table中定义的InputFormat根本无关,了解hadoop的应该知道,Combine表示可能会合并多个小文件一起处理,与我们当前需求并不符合。而如果需要设置每个文件只能由一个map任务来处理时,原来的继承FileInputFormat并重写isSplittable方法并不起作用,抛出异常。这是因为Hive中启动的mapreduce任务的InputFormat必须是org.apache.hadoop.hive.ql.io.HiveInputFormat的子类,可以通过设置mapred.input.format.class=org.apache.hadoop.hive.ql.io.HiveInputFormat,并将参数mapreduce.input.fileinputformat.split.minsize设置(单位是字节)的非常大来达到目的。

也可以在hive配置文件中进行整体的调整:

<property>
<name>mapreduce.input.fileinputformat.split.minsize</name>
<value>1099511627776</value>
</property>
<property>
<name>hive.input.format</name>
<value>org.apache.hadoop.hive.ql.io.HiveInputFormat</value>
</property>

UDF函数

Hive中有很多的内置函数,如果可以通过内置函数来解决,就不需要编写UDF来完成任务。

可以通过下面的命令来显示出hive中的所有内置函数:

hive -e "show functions";

比如可以使用from_unixtime,cast, hour三个函数的组合来完成将时间转换成小时的工作:

hour(from_unixtime(cast(raw['ti'] as bigint),'yyyy-MM-dd HH:mm:ss'))

如何在hive中自定义UDF(User Define Function)?这里说明一下如何在java中定义UDF。

首先,需要继承类:org.apache.hadoop.hive.ql.exec.UDF,并写一个名称为evaluate的函数,由于Hive使用的是反射的方式来进行调用的,并不强调参数以及返回值,可以随便写,在使用时注意就可以了(甚至可以在UDF函数中重载多个evaludate方法)。

编写完成后,需要在HQL脚本中使用下面的方式来进行调用:

add jar “对应的jar包路径”
create temporary function function_name as 'UDF类名称';

之后,就可以在sql中使用function_name进行操作,注意其输入参数以及返回值。

HQL语句

hive中可以执行HQL语句,其基本格式与SQL语句非常类似。可以通过hive shell的方式执行,也可以通过hive –e “hql语句”或hive –f “hql文件”的方式执行。

示例:

select example_udf_function(doc) raw   from example_table;

此外,HQL语句还支持嵌套。这部分只是个入门教程,因此,后续深入研究。

Hive使用入门的更多相关文章

  1. [Hadoop大数据]——Hive部署入门教程

    Hive是为了解决hadoop中mapreduce编写困难,提供给熟悉sql的人使用的.只要你对SQL有一定的了解,就能通过Hive写出mapreduce的程序,而不需要去学习hadoop中的api. ...

  2. Hadoop生态圈-Hive快速入门篇之HQL的基础语法

    Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...

  3. Hadoop生态圈-Hive快速入门篇之Hive环境搭建

    Hadoop生态圈-Hive快速入门篇之Hive环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据仓库(理论性知识大多摘自百度百科) 1>.什么是数据仓库 数据 ...

  4. hive编程入门课程(加精)

    hive编程入门课程 http://wenku.baidu.com/link?url=BfyZWjz48G_6UJImzWw39OLB0sUrIYEYxoxNpaFbADUQekmOvQy4FPY1f ...

  5. [转帖]Hive 快速入门(全面)

    Hive 快速入门(全面) 2018-07-30 16:11:56 琅琊山二当家 阅读数 4343更多 分类专栏: hadoop 大数据   转载: https://www.codercto.com/ ...

  6. hive从入门到放弃(一)——初识hive

    之前更完了<Kafka从入门到放弃>系列文章,本人决定开新坑--hive从入门到放弃,今天先认识一下hive. 没看过 Kafka 系列的朋友可以点此传送阅读: <Kafka从入门到 ...

  7. hive从入门到放弃(二)——DDL数据定义

    前一篇文章,介绍了什么是 hive,以及 hive 的架构.数据类型,没看的可以点击阅读:hive从入门到放弃(一)--初识hive 今天讲一下 hive 的 DDL 数据定义 创建数据库 CREAT ...

  8. hive从入门到放弃(三)——DML数据操作

    上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言. 没看过的可以点击跳转阅读: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--D ...

  9. hive从入门到放弃(四)——分区与分桶

    今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...

  10. HIVE快速入门

    (一)简单入门 1.创建一个表 create table if not exists ljh_emp( name string, salary float, gender string) commen ...

随机推荐

  1. 记 fastjson泛型转对象 第一次可以正常转,第二次就变成JSONArray 问题

    在解析json数据的时候,在使用泛型对象的时候即: public class ResultMsgDto<E> implements Serializable { private stati ...

  2. 2018-2019 2 20165210 《网络对抗技术》Exp5 MSF基础

    2018-2019 2 20165210 <网络对抗技术>Exp5 MSF基础 实验内容: 一个主动攻击实践,如ms08_067(成功); 一个针对浏览器的攻击,如ms10_046(成功) ...

  3. React之组件

    鉴于个人的开发习惯,我将react默认的文件结构作了如下修改: 我们的项目是写在src目录下的. 那么,接下来,继续看react的组件式如何编写的吧. 一.react的组件 不同于vue的每个组件都是 ...

  4. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  5. Spring之基本关键策略

    目的 为了简化Java开发. 策略 基于POJO(普通Java类)的轻量级和最小侵入性编程: 通过依赖注入(DI)和面向接口实现松耦合: 基于切面和惯例进行声明式编程: 通过切面和模板减少样板式代码. ...

  6. JSP学习(一)JSP基础语法

    JSP基础语法 1.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素. JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. <%@ page language=&quo ...

  7. 使用python处理selenium中的获取元素属性问题

    # 获取我的订单元素class属性值 at = self.driver.find_element_by_link_text('我的订单').get_attribute('class') # 判断cla ...

  8. 关于swagger文档的使用方法

    引言 最近在后台开发的时候,使用swagger2进行前后台接口文档的声明.由此遇见的一些问题,写下来给自己复习. 参考: https://blog.csdn.net/xupeng874395012/a ...

  9. 揭示同步块索引(中):如何获得对象的HashCode

    转自:http://www.cnblogs.com/yuyijq/archive/2009/08/13/1545617.html 题外话:为了尝鲜,也兴冲冲的安装了Win7,不过兴奋之余却郁闷不已,由 ...

  10. redis在mac中的安装和启动

    http://blog.csdn.net/chenshuai1993/article/details/51519384 http://www.jianshu.com/p/6b5eca8d908b