数据仓库与Hive

一、数据仓库

1、数据仓库定义?

关于数据仓库(Data Warehouse, DW)的定义比较常见的一种是数据仓库之父比尔·恩门在1991年出版的《建立数据仓库》一书中所提出的定义:

数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。

还有一种常见的描述是:

数据仓库是将源系统数据抽取、转化、清洗,存储到维度模型中的系统,为分析决策提供查询、分析的支持。

所以数据仓库到底是什么?看完定义描述依旧不知道 =_=||。

《数据仓库入门,看这这一篇就够了》一文中对数据仓库的解释是这样的:

数据仓库是面向分析的存储系统
也就是说数仓是存数据的,企业的各种数据往里面塞,主要目的是为了有效分析数据,后续会基于它产出供分析挖掘的数据,或者数据应用需要的数据

回过头来理解 面向主题的、集成的、相对稳定的、反映历史变化

面向主题的——数据仓库通过一个个主题域将多个业务系统的数据加载到一起
集成的——数据仓库会将不同源数据库中的数据汇总到一起
相对稳定的——数据仓库中的数据一般仅执行查询操作,很少会有删除和更新。但是需定期加载和刷新数据。
反映历史变化——数据被加载后一般情况下将被长期保留,因此数据仓库包含来自其时间范围不同时间段的数据

这四个描述就是反应数据仓库存储数据的特点,各种来源的数据按主题长期的存储,用于分析决策。

2、数据仓库和数据库的差别是什么?

主要差别是在以下两方面:

  • 实时性差异——关系数据库都是为实时查询的业务进行设计的,而数据仓库则是为海量数据做分析挖掘设计的,实时性要求不高;
  • 存储能力和计算能力扩展——数据仓库在存储能力和计算能力上更好,而关系数据库在这个方面要差很多。

3、数据仓库和hive的关系?

提到数据仓库经常听到hive。hive是什么?hive和数据仓库的关系是什么?

(1)hive是什么?

Hadoop是一个能够对大量数据进行分布式处理的软件框架,Hive 是 Hadoop 中的一个重要子项目,是基于Hadoop的一个数据仓库工具(存数据的工具)

(2)Hive内部结构

CLI, WebUI为hive的用户接口;
元数据存储在mysql,主要数据存储在HDFS;
Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务,利用MapReduce 进行计算[2]

(3)数据仓库与hive关系

数据仓库比较流行的工具有:AWS Redshift, Greenplum, Hive等。
之前提到数据仓库将各种来源的数据按主题长期的存储,至于存数据用纸盒子、塑料盒子、铁盒子都是可选的,hive就是存数据的一种盒子。

二、hive的操作

在实际生产环境中已经形成了离线以Hive为主,Spark为辅, 实时处理用Flink的大数据架构体系及Impala, Es,Kylin等应用查询引擎。
以下采用Spark on Hive模式(即使用Hive作为Spark的数据源,用Spark来读取HIVE的表数据,数据仍存储在HDFS上)汇总基础sql操作。

1、创建/删除数据

(1)无中生有

创建一个包含id,name,age,class信息的表,要求id、age为数值型,name、class为字符型。

# 表格框架
spark.sql("create table IF NOT EXISTS student(id int, name string,age int,class string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'")
# 插入行数据
spark.sql("insert into student values(1,'小明',23,'奥数')")
spark.sql("insert into student values(2,'小红',33,'英语')")
spark.sql("insert into student values(3,'小红',13,'语文')")
spark.sql("insert into student values(4,'小朱',43,'体育')")
spark.sql("insert into student values(6,'Lily',13,'英语')")
spark.sql("insert into student values(7,'Mark',53,'英语')")
# 效果查看
spark.sql("select * from student").show()
(2)查询建表

原创建表挺麻烦的,查询建表更方便一些。

spark.sql("create table if not exists student2 select id, name from student")
spark.sql("select * from student2").show()
(2)drop 删除表格

如果不想要student2这张表,使用drop table删除。

spark.sql("drop table student2")

2、函数操作

(1)日期相关函数

想要在表格上新增一列日期信息。
unix_timestamp()为获取当前时间戳的函数(格式为:1572853933),from_unixtime函数转换时间戳为日期格式。

spark.sql("create table if not exists student2 as select *,from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss') as date from student")
spark.sql("select * from student2").show()

# 取时间范围的数据(取昨天的数据)
# Hive SQL中的[datediff(endDate, startDate)函数返回的是2个日期的天数差值
# CURRENT_DATE为当前时间
spark.sql("select CURRENT_DATE").show()  # 查看当前日期
spark.sql("select * from student2 where datediff(CURRENT_DATE,date)=1").show()
(2)row_number 数据表去重

表格有两个小红存在,想根据name对数据去重。

hive中使用row_number()对表格去重。“row_number() over (partition by name order by id desc) ” 根据name去重,根据id排序

spark.sql("select * from (select  id,name,age,row_number() over (partition by name order by id desc) as rn from student) t where t.rn = 1").show()
(3)group by 统计各类及数量

想要知道有多少类学科,每类学科有多少人?

spark.sql("select class,count(1) from student group by class").show()
(4)and/or 多条件检索

检索name为小红,age大于30的数据信息。

spark.sql("select * from student where name='小红' and age>30").show()
(5)Concat组装新信息

Concat()将多个字符串连接成一个字符串

spark.sql("create table if not exists student3 as select *, concat(name,'编号为',id,',年龄为',age,',教授',class) as info from student")
spark.sql("select * from student3").show()
(6)join 黑名单匹配/过滤

已知学校存在一个黑名单库,想要只查看匹配黑名单的信息

# 先创建黑名单
spark.sql("create table IF NOT EXISTS blackStudent(name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'")
spark.sql("select * from blackStudent").show()
spark.sql("insert into blackStudent values('小明')")
spark.sql("insert into blackStudent values('小红')")
spark.sql("insert into blackStudent values('王菲')")
spark.sql("insert into blackStudent values('江山')")
spark.sql("insert into blackStudent values('肖战')")
spark.sql("insert into blackStudent values('王一博')")
# 匹配黑名单,inner join取两张表的合并部分
spark.sql("select * from student inner join blackStudent on student.name=blackStudent.name").show()

想要过滤黑名单的成员信息然后存储成一张新表

# left outer join 以左表 student为核心做匹配,去未匹配成功(null)的信息
spark.sql("create table student4 select id, student.name,age,class from student left outer join blackStudent on student.name=blackStudent.name where blackStudent.name is null")
spark.sql("select * from student4").show()

4、udf

UDF(user-defined function),当hive自带的函数无法满足数据预处理,支持自建函数。

def mymodel(age):
    if age>20:
        result=0
    else:
        result=1
    return result
from pyspark.sql.types import IntegerType
spark.udf.register('mymodel',mymodel,IntegerType())  # 函数返回值类型为integer
spark.sql("select * from student3 where mymodel(age)>0").show()

三、大规模数据处理

Spark 是专为大规模数据处理而设计的快速通用的计算引擎,传统基于本地python计算的模式在面对大规模数据量时性能和时间都无法保障,基于spark的机器学习很重要哦。

参考资料

[1] 数据仓库入门,看这这一篇就够了:https://zhuanlan.zhihu.com/p/39611221
[2] hive简介:https://www.shiyanlou.com/courses/reports/1385266/
[3] Spark是否能替代Hive:https://blog.csdn.net/ys_230014/article/details/83210800

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

推荐阅读更多精彩内容

  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,277评论 0 34
  • 数据仓库(Data Warehouse ) 1.1 基本概念 数据仓库的目的是构建面向分析的集成化的数据环境, 为...
    c062197eecd2阅读 1,557评论 0 19
  • 注:转自 大数据经典学习路线(及供参考) 1.Linux基础和分布式集群技术 学完此阶段可掌握的核心能力: 熟练使...
    4ea0af17fd67阅读 763评论 0 0
  • 我是惧于用自己拙劣的文笔来描述一座城市的,来去匆匆的,知道的太少,想写的东西,也不过是一个旅人的印象罢了。南京,确...
    _Super米阅读 475评论 3 4
  • https://blog.csdn.net/sinat_17775997/article/details/7287...
    理子阅读 43评论 0 0