Hive

为什么要有Hive?

在使用Hadoop的过程中,大家都会感觉每次都要写MR程序才能操作到HDFS的文件,太麻烦了,而且如果项目又赶,项目人员不会写MR程序,还要花费大量的时间去学,但是我是知道文件内容,是用什么分割的,分割后的每一列是什么意思,感觉好像关系型数据库。

于是有群人就有了个想法,既然我知道了这些数据分割后的每一列数据的意义,那么能不能把关系型数据库的SQL解析器搬过来呢?

并把这个解析的映射改为MR程序的映射,用户只要按照定义好的语法去写,我就给你解析成对应的MR程序去运行。


什么是Hive?

      Hive是基于Hadoop的数据仓库工具,将结构化的数据映射成一张数据库表,并提供类似SQL查询功能,称为HQL,本质就是封装MR程序。


数据库和数据仓库区别(概念)

假设商店场景,数据库是存储小物品,而且还是归类好的物品,并且是库存不够的时候就可以很快的就拿到了。

数据仓库是存储了一堆的东西,包括已经过期,准备回收的商品,而且很大,并且还可以存储和数据库存储的东西,所相关的东西,比如牛奶卖出去了,这个大的牛奶盒子这些。

数据库就是存储存储定向的数据,如商品的最新信息,毕竟商品的价格每天都会变。

数据仓库存储类似历史数据或主题数据,如,订单相关的物流信息,商品的历史价格这些,而且和业务系统不一定完全一样,主要用于统计、数据分析等



元数据是什么?

      元数据就是一个东西的描述信息,比如衣柜,衣柜的外观、大小、材质、容量、衣柜的哪一格存放了什么东西等等,这些就是元数据。



特点

      可扩展性:Hive可以自由的扩展集群规模,一般情况下不需要重启服务。

      延展性:支持用户自定义函数。

      容错性:节点出问题了,HQL依然可以完成。



组成

用户接口

CLI:shell命令行

JDBC/ODBC:Hive的Java实现

WebGUI:浏览器访问


元数据存储

Hive将元数据存储在数据库中,Hive中的元数据包括表的名称、列、分区、属性、是否是外部表、所在目录等等



解析

      解析器、编译器、优化器完成HQL查询语句到词法解析、语法解析,编译、优化、查询计划生成,查询计划是存储在HDFS,之后调用MR执行。




Hive与传统数据库对比

 Hive传统数据库

查询语言HQLSQL

数据存储HDFSRaw Device or LocalFS

执行MRExecutor

执行延迟高低

数据量多少

索引0.8版本(位图索引)复杂



Hive数据存储

DB(数据库):HDFS下的/user/hive/warehouse文件夹

      Table(内部表):HDFS下/user/hive/warehouse/数据库/表,表删除后对应的文件夹也删除

      External Table(外部表):类似Table,就是数据存放位置可以任意指定路径,删除后,位于HDFS中的文件不会给删除。

      Partition(分区):HDFS下/user/hive/warehouse/数据库/表/区。

                                   分区是一种逻辑性和物理上的优化,以空间换取时间,把一个表的数据切分成两个进行存储,这个切分可能是按照时间做切割,后面再查询的时候,内部会根据条件去判断要到哪个文件夹去找数据。

      Bucket在HDFS中同一个表目录下根据Hash散列后的不同文件,类似10%2=0,存储到文件1,=1存储到文件2,=2存储到文件3…



使用

bin/hive本地客户端

            bin/hive -e "select * from库名.表名;":执行执行

            bin/hive-e "use库名;select * from表名;":直接执行

            bin/hive-f文件.hql:将复杂的hql语句放到文件内,并执行

 

      bin/hiveserver2开启远程服务

            其他机器启动:bin/beeline

            其他机器连接:!connectjdbc:hive2://hadoop-s01.levi.com:10000

      cat ./hivehistory使用过的历史HQL命令



配置文件常用项(hive-site.xml)

 javax.jdo.option.ConnectionURL

 jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true


 javax.jdo.option.ConnectionDriverName

 com.mysql.jdbc.Driver


 javax.jdo.option.ConnectionUserName

 root


 javax.jdo.option.ConnectionPassword

 root


  hive.cli.print.header

 true


 hive.cli.print.current.db

 true


<!-- 简单的查询不走mapreduce -->

 hive.fetch.task.conversion

 more


 hive.server2.thrift.port

 10000


 hive.server2.thrift.bind.host

 localhost


  hive.server2.long.polling.timeout

 5000



Hive函数


数据类型

数值

类型支持范围

TINYINT1字节带符号整数,从-128到127

SMALLINT2字节带符号整数,从-32,768到32,767

INT/INTEGER4字节带符号整数,从-2,147,483,648到2,147,483,647

BIGINT8字节带符号整数,从-9,223,372,036,854,775,808到9,223,372,036,854,775,807

FLOAT4字节单精度浮点数

DOUBLE8字节双精度浮点数

DOUBLE精度

DECIMAL十进制数据类型在Hive

  0.11.0 (Hive -2693)中引入,在Hive 0.13.0 (Hive -3976)中进行了修改。


日期

类型支持版本

TIMESTAMP注意:只能从Hive 0.8.0开始使用

DATE注意:只能从Hive 0.12.0开始使用

INTERVAL注意:只能从Hive 1.2.0开始使用


其他

类型支持版本

arraysARRAY(data_type)注:Hive0.14允许负值和非常量表达式。

mapsMAP(primitive_type,  data_type)注:Hive0.14允许负值和非常量表达式。

structsSTRUCTcol_name  : data_type [COMMENT col_comment], …)

unionUNIONTYPE(data_type,  data_type, …)注意:只能从Hive

  0.7.0开始使用。

string字符串 

 

ARRAYARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的

[if !supportLineBreakNewLine]

[endif]

MAPMAP包含key->value键值对,可以通过key来访问元素。比如”userlist”是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password;

[if !supportLineBreakNewLine]

[endif]

STRUCTSTRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。

[if !supportLineBreakNewLine]

[endif]

UNIONUNIONTYPE,他是从Hive 0.7.0开始支持的。



常用HQL

创建数据库:CREATE DATABASE IF NOT EXISTS levi;

     

      设置变量临时生效:set hive.cli.print.header=false

     

创建表:create table if not exists test(idstring,name string,sex string) row format delimited fields terminated by '\t';

      创建表:create table newtb as select * fromdb.tname

      创建表:create table newtb like db.tname

      创建外部表:create external table test2(id int,namestring) row format delimited fields terminated by '\t'

      创建表(分区):create table if not exists levi.t_partition(id string,

name string)partitioned by (datestring,hour string)

row format delimited fields terminated by'\t';

      创建表(分桶):create table people(id string,name string)clusteredby(id) sorted by (id) into 3 buckets row format delimited fields terminated by '\t';

      创建表(正则):

create table IF NOT EXISTS test (

id string,

name string

)

ROW FORMAT SERDE'org.apache.hadoop.hive.serde2.RegexSerDe'

WITH SERDEPROPERTIES (

"input.regex" = "(\"[^ ]*\")(\"-|[^ ]*\") (\"[^\]]*\") (\"[^\"]*\")(\"[0-9]*\") (\"[0-9]*\") (-|[^ ]*) (\"[^ ]*\")(\"[^\"]*\") (-|[^ ]*) (\"[^ ]*\")"

)

STORED AS TEXTFILE;


      查看表信息:desc formatted tbname


      导入数据(本地):load data local inpath '/local_path/file' into table 表名;

      导入数据(本地)(覆盖):load data local inpath '/local_path/file'

overwrite into table 表名;

      导入数据(HDFS):load

data inpath '/local_path/file' into table 表名;

      导入数据:insert into table 表名select * from tbname;

      导入数据:insert overwrite into table 表名select * from tbname;

      导入数据(分区):load data local inpath'/opt/module/hive-hql/1999092919' into table levi.t_partitionpartition(date='19990929',hour='19');

      导出(本地):insert overwrite local directory"/opt/module/hive-hql/data_dir/"row format delimited fieldsterminated by '\t' select * from levi.tname;

      导出(HDFS):insertoverwrite directory "path/" select * from levi.tbname;


      自定义UDF函数:

public class ToLowerCase extends UDF {

 public Text evaluate(Text str) {

 if(null == str) {

 return null;

          }

 if(null != str && str.toString().length() <= 0) {

 return null;

          }

 return new Text(str.toString().toLowerCase());

     }

}


      添加到hive的classpath:add jar /opt/lowercase.jar    

      添加到Hive函数列表:create

temporary function 函数名as

'包名.类名'

      运行函数:select 函数名(name) from student;



排序

      order by全局排序,会强行的把reducer改为一个,就算分桶了,还是查询所有数据。

      sort by数据进入reducer前完成排序,因此使用sort by排序,并设置mapred.reduce.tasks>1,则sort by保证每个reducer输出有序,不保证全局有序,就算是对每一个reduce内部数据进行排序。

      distribute by根据ditribute by指定的字段,将数据分发不同reducer,而且分发算法是hash散列算法。

      cluster by就是sort by + distribute by。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Hive是什么? Hive是一种基于Hadoop的数据库技术并提供完整的sql查询功能, . HIVE能做什么? ...
    日出卡尔阅读 2,484评论 0 0
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本...
    felix521阅读 1,257评论 0 0
  • Hive是构建在Hadoop HDFS上得一个数据仓库 数据仓库是一个面向主题的、集成的、不可更新的、随时间不变化...
    Sx_Ren阅读 907评论 0 9
  • hive.ddl.output.format:hive的ddl语句的输出格式,默认是text,纯文本,还有json...
    博弈史密斯阅读 1,881评论 0 6
  • 数组去重可以有六种方法 声明:所有文章都是转载整理的,只是为了自己学习,方便自己观看,如有侵权,请立即联系我,谢谢...
    是河兔兔啊阅读 260评论 0 0