数据仓库Hive入门

一、什么是数据仓库

数据仓库(Data Warehouse,DW),是一种用于存储、分析和报告的数据系统,其目的是构建面向分析的集成化数据环境,其本身不产生数据,也不消费数据。

  • 面向主题,是高层次上数据综合归类的地方;
  • 集成性,是多个数据源统一综合的地方;
  • 非易变性,会保留相当长时间的历史数据,这些数据会提供大量的查询操作,但极少会修改和删除它们;
  • 时变性,数据会随着时间变化而更新,以满足变化的需求场景;

二、什么是Hive

Hive是建立在Hadoop之上的开源数据仓库系统,可以将存储在HDFS中的结构化、半结构化数据文件映射为一张数据库表,并基于表提供一种类SQL查询模型(HQL),用于用户访问和分析存储在HDFS中的大型数据集。其本质就是将HQL转换为MapReduce程序,然后提交给Hadoop集群执行。

三、为什么要使用Hive

不使用Hive也是可以的,但是会面临如下的问题:

  • 数据分析人员直接编写MapReduce成本较高,需要掌握Java语言;
  • 开发MapReduce来实现复杂查询逻辑比较困难;

而使用Hive的好处则是:

  • 接口操作采用了HQL,一款类似SQL的查询语法,上手难度低,开发效率高;
  • 避免了直接编写MapReduce程序,减少了学习成本;
  • 支持自定义函数,扩展功能也很方便;
  • 依靠Hadoop,天然擅长存储和分析海量的数据集;

所以Hive的最大优势就是可以让用户专注于编写HQL,而无需操心Hadoop底层的存储和计算过程,大大解放了用户的时间和脑力。

四、Hive是如何工作的

Hive主要包含如下几部分的组件:

  • 用户接口,其中CLI是命令行接口,Web Interface允许浏览器访问Hive,Thrift Server则是允许外部客户端通过JDBC/ODBC的协议和Hive进行交互;
  • 元数据存储,即描述数据的数据,主要是表的名字、表的列信息、表的属性、映射的文件信息等都存放再关系型数据库中,比如MySQL和Derby;
  • 驱动程序,主要包含解析器、编译器、优化器、执行器等,将HQL转换为可以在计算框架上执行的代码;
  • 执行引擎,也就是计算框架,比如支持的MR、Tez、Spark等;
Hive架构示意图

五、如何使用Hive

在使用Hive之前,我们需要拥有一个健康运行的Hadoop集群,然后在其上安装MySQL和Hive,这部分内容网上有很多教程,此处不做赘述了。

和关系型数据库一样,Hive拥有CLI命令行客户端,但是一般开发人员不会这么使用,都有更好的图形化工具使用,比如DataGrip、Dbeaver等,更加友好也能大大提升HQL编写的效率。

5.1 DDL语句

一、建表

-- 创建数据库,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db
create database if not exists zhangxun comment "zhangxun test database";
-- 切换数据库
use zhangxun;
-- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_user_info
create table t_user_info(
    id int comment "ID",
    name string comment "用户姓名",
    gender int comment "性别:0-男,1-女",
    age int comment "年龄"
) comment "用户信息表"
-- 指定文件中字段之间的分隔符
row format delimited fields terminated by ",";
-- 导入数据操作(在hadoop集群的命令行里面操作上传)
-- hadoop fs -put user-info.txt /user/hive/warehouse/zhangxun.db/t_user_info
-- 查询数据
select * from t_user_info;

如下是自己准备的用户信息文件user-info.txt

1,张三,0,22
2,lisa,1,21
3,jerry,0,28
4,jack,0,32
5,micky,1,29

二、导数

如上导入数据我们是使用的hdfs命令,Hive不推荐我们这么做,使用Hive的Load命令也可以实现数据的导入:

-- 创建数据表,对应HDFS存储路径为/user/hive/warehouse/zhangxun.db/t_car_info
create table t_car_info(
    id int comment "ID",
    brand string comment "汽车品牌",
    year int comment "年份"
) comment "汽车信息表"
row format delimited fields terminated by ",";
-- 从HiveServer2所安装的服务器的路径上传到HDFS的/user/hive/warehouse/zhangxun.db/t_car_info下面
load data local inpath '/root/data/car-info.txt' into table t_car_info;
-- 查询数据
select * from t_car_info;

5.2 DML语句

一、插入数据

在上面我们提到Hive作为数据仓库具有“非易变性”,也就是说通常很少有场景会要去对已存的数据进行修改和插入,所以通常插入数据的场景多见于数据清洗和转换的需要。比如:

  • 原始表中的数据字段非常多,我们用于分析的数据并需要这么多无关的字段;
  • 原始表中存在脏数据,在分析前需要将这些脏数据进行过滤;
  • 原始表中存在非原子列或者不是理想的字段格式,需要在分析前将其拆分和转换;
  • 等等其它场景;

我们使用:

-- 先创建目标表
create table t_target_user(id int,age int);
-- 将原始表中的数据清洗后存入目标表(假设没有name值的用户信息是无效的)
insert into table t_target_user select id,age from t_user_info where name is not null;

或者更简单的:

-- 无需提前创建目标表
create table t_target_user as select id,age from t_user_info where name is not null;

二、查询数据

  • select_expr,查询表达式,可以是字段、函数;
  • all/distinct,用于指定查询结果中重复的行如何处理;
  • where,过滤条件;
  • 聚合函数操作,比如count、sum、max、min、avg等函数,特点是不管原始数据有多少行,输出结果只有一条,就是聚合的结果;
  • group by,和聚合函数结合使用,根据一个或者多个列,对它们的内容进行分组聚合;
  • having,和group by结合使用,基于group by的结果进行过滤,并且支持使用聚合函数作为过滤条件;
  • order by,按照指定的列对结果集进行排序;
  • limit,限制查询返回的行数;

三、关联数据

  • inner join,也就是join,两个表中都存在与连接条件相匹配的数据才会被留下来;
  • left outer join,也就是left join,以左表的全部数据为准,右表与之关联上的才会被保留下来;

四、常用函数

-- 查看所有可用的函数
show functions;
-- 查看某个具体函数的使用方法
describe funciton extended funciton_name;
  • 数值类型函数
  • 日期类型函数
  • 字符串类型函数
  • 集合函数
  • 条件函数
  • 等等其它

五、自定义函数

  • UDF,User Defined Function,普通函数,一个输入一个输出;
  • UDAF,User Defined Aggregation Function,聚合函数,多个输入一个输出;
  • UDTF,User Defined Table-Generating Function,表生成函数,一个输入多个输出;

更多关于函数的内容可以参考LanguageManual UDF - Apache Hive - Apache Software Foundation

总结下来,大体的使用方式和SQL语法一致,更多内容可以参考Home - Apache Hive - Apache Software Foundation

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

推荐阅读更多精彩内容