Hive入门讲解

简介

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

为什么要使用Hive?

首先我们看下直接使用Hadoop所面临的问题:

  • 人员学习成本高
  • 项目周期要求太短
  • MapReduce实现复杂查询逻辑开发难度太大

由于Hadoop存在上述问题,所有引入Hive:

  • 操作接口采用类SQL语法,提供快速开发的能力
  • 避免去写MapReduce程序,减少开发人员的学习成本
  • 扩展功能很方便

Hive的特点

  • 可扩展:Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
  • 延展性:Hive支持用户自定义函数,用户可以根据自己需求实现自己的函数。
  • 容错:良好的容错性,节点出问题SQL仍可完成执行。

Hive架构和原理


原理:Hive通过用户提供的以下系列交互接口,接受到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行的结果输出到用户交互接口。

Hive的服务端组件

  1. 用户接口:Client CLI(hive shell命令行),JDBC/ODBC(访问hive),WEBUI(浏览器访问hive)
  2. 元数据:MetaStore,包括,表名,表所属数据库(默认default),表的拥有者,列/区分字段,表的类型(是否是外部表),表的数据所在目录等。
  3. Hadoop使用HDFS进行存储,使用MapReduce进行计算。
  4. 驱动器:Driver
    (1) 解析器(SQL Parser):将SQL字符转换成抽象的语法树AST,这一步一般使用都是第三方工具库完成,比如antlr,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语句是否有误
    (2)编译器(Physical Plan):将AST编译生成逻辑执行计划
    (3)优化器(Query Optimizer):对逻辑执行计划进行优化
    (4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark

Hive与传统数据库对比

总结:Hive具有sql数据库的外表,但应用场景完全不同,Hive只适合用来做批量数据统计分析

Hive的数据存储

  1. Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,Rcfile等)。
  2. 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
  3. Hive 中包括以下数据模型:DB、Table、External Table、Partition、Bucket。
  • DB: 在 HDFS 中表现为 ${hive.metastore.warehouse.dir} 目录下的一个文件夹
  • Table: 在HDFS中表现为所述DB目录下的一个文件夹
  • External Table:与Table类似,不过期数据存放位置可以在任意指定路径
  • Partition: 在HDFS中表现为Table目录下的子目录
  • Bucket: 在HDFS中表现为表目录下根据 hash 散列之后的多个文件

Hive的安装部署

  • 单机版
  • 元数据库MySQL版


Hive使用方式

  • 1. Hive交互shell

    bin/hive
    hive> select * from t_user;

  • 2. 将Hive启动为一个服务:

    启动方式:
    (1)启动为前台:bin/hiveserver2
    (2)启动为后台:nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &

    启动成功后,可以在别的节点上使用beeline去连接

    方式1:hive/bin/beeline 回车,进入beeline的命令界面
    输入命令连接hiveserver2
    beeline> !connect jdbc:hive2://hdp-05:10000
    (hdp-05是hiveserver2所启动的那台主机名,端口默认:10000)

    方式2 : 启动就连接
    bin/beeline -u jdbc:hive2://hdp-05:10000 -n hadoop
    接下来就可以做正常sql查询了

  • 3. 将Hive作为命令一次性运行
    bin/hive -e ‘sql’
    bin/hive -e "sql1;sql2;sql3;sql4"
    事先将sql语句写入一个文件比如 q.hql ,然后用hive命令执行:
    bin/hive -f q.hql

  • 4. 脚本化运行
    可以将方式3写入一个xxx.sh脚本中
    vi t_test_hive.sh

#!/bin/bash
hive -e "select * from db_test.t_user"
hive -e "select * from default.t_user"
hql = "create table default.t_bash as select * from db_test.t_user"
hive -e "$hql"

Hive 基本操作

DDL操作

  • 创建库
create database db1;

hive就会在 /user/hive/warehouse/下新建一文件夹

  • 创建内部表
use db1;
create table t_test(id int,name string,age int,create_time bigint) row format delimited terminated by '\001';

建表后,hive会在仓库目录中建一个表目录:`

/user/hive/warehouse/db1.db/t_test`
  • 创建外部表
create external table t_test1(id int,name string,age int,create_time bigint)
row format delimited
fields terminated by '\001'
location '/external/t_test';
  • 内部表&外部表
    未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
    **区别: **

    • 内部表数据由Hive自身管理,外部表数据由HDFS管理;
    • 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
    • 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
    • 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
  • 导入数据
    本质就是把数据文件放入表目录,可以用hive命令来做:

    1. 从本地导入
    load data local inpath 'file_path' into table tbname;
    
    1. 从hdfs上导入数据
    load data inpath ‘hafd_file_path’ into table tbname;
    

    应用场景:使用与大数据的存储

    1. load方式的覆盖
     load data local inpath 'file_path' overwrite into table tbname;
    

    应用场景:用于临时表。


    1. 子查询方式
      应用场景:对于数据查询的结构的保存。
    table tb2 as select * from tb1;
    
    1. insert into
      应用场景:和上面的应用场景相同,因为后面接的都是select查询。
      不需要as,直接后接入select。
    insert into table tb2 select q1;
    
    1. location
      这种情况适用于前面说的外部表,或者管理表中对于表数据的指定。
      然后put就好。
      我想,前提是需要先建一个表。


在HDFS上看效果

  • 建分区表
    分区的意义在于将数据分散到子目录存储,以便于查询时让数据读取范围更精准。

    create table t_test1(id int,name string,age int,create_time bigint)
    partitioned by (day string,country string)
    row format delimited
    fields terminated by '\001';
    

    插入数据到指定分区:

     hive> load data [local] inpath '/data/path1' [overwrite] into table t_test1 partition(day='2019-10-14',country='China');
     hive> load data [local] inpath '/data/path2' [overwrite] into table t_test1 partition(day='2019-10-15',country='China');
     hive> load data [local] inpath '/data/path3' [overwrite] into table t_test1 partition(day='2019-10-16',country='England');
    

    导入完成后,形成的目录结构如下:

    /user/hive/warehouse/db1.db/t_test1/day=2019-10-14/country=China/...
    /user/hive/warehouse/db1.db/t_test1/day=2019-10-15/country=England/...
    /user/hive/warehouse/db1.db/t_test1/day=2019-10-16/country=China/...
    

    注意:分区中的字段不能是表中已存在字段

    查询 2019-10-15 数据:
    select from t_test1 where day='2019-10-15'
    这样MapReduce程序就只会去查 day='2019-10-15' 子目录的文件数据。

表定义的修改:改表名、增加列,删除列,修改列定义.......

DML操作

基本查询语法跟标准sql基本一致

FROM T1 
JOIN T2
WHERE CONDITION
GROUP BY FILEDS
HAVING CONDTION
ORDER BY FIELDS DESC|ASC

各类JOIN语法跟SQL也基本一致,不过HIVE有一个自己的特别的JOIN: LEFT SEMI JOIN
hive在1.2.0之前不支持“不等值”join,但在1.2.0后支持不等值join,只是语法必须按如下形式写:

SELECT A.*,B.* from A,B WHERE A.ID>B.ID;
各类流程控制语句根SQL也基本一致:
case when l.userid is null
then concat('hive',rand())
when l.userid > 20
then concat('hive',rand())
else l.userid

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

推荐阅读更多精彩内容

  • Hive是构建在Hadoop HDFS上得一个数据仓库 数据仓库是一个面向主题的、集成的、不可更新的、随时间不变化...
    Sx_Ren阅读 941评论 0 9
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本...
    felix521阅读 1,291评论 0 0
  • 快乐大数据第5次课 hive(1)工作原理Hive的执行入口是Driver,执行的SQL语句首先提交到Drive驱...
    快乐大数据阅读 381评论 0 0
  • 青砖黛瓦、木门铜锁 小桥流水、树影婆娑 那是记忆里的中式院落 体现了人们超越于物质之上的 对于精神空间的极致追求 ...
    在路上_50ef阅读 489评论 0 0
  • 上善若水任方圆 程诺打心眼里不想收这钱,可杨东明却是一个劲儿地非要给,程诺情急之下也只好胡扯道:“那要不这样,上次...
    诺阳阁阅读 640评论 0 0