大数据

Hive入门讲解

2019-10-22  本文已影响0人  匆匆岁月

简介

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

为什么要使用Hive?

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

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

Hive的特点

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。

Hive的安装部署

Hive使用方式

#!/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';

在HDFS上看效果

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

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

上一篇 下一篇

猜你喜欢

热点阅读