Hive数据仓库实战

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】


前言

Hive作为大数据平台Hadoop之上的主流应用,公司一般都是用它作为公司的数据仓库,分布式机器学习的训练数据和数据处理也经常用它来处理,下面介绍下它的常用功能。

一、Hive原理和功能介绍

Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能, Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。

Hive可以将SQL语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。同时,这个Hive也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和reducer无法完成的复杂的分析工作。比如UDF函数。

简单来讲,Hive从表面看来,你可以把他当成类似Mysql差不多的东西,就是个数据库而已。按本质来讲,他也并不是数据库。其实他就是一个客户端工具而已,真实数据是在Hadoop的HDFS分布式文件系统上存着,知识它提供一种方便的方式让你很轻松把数据从HDFS查询数据和更新数据。Hive既然是一个客户端工具,所以并不需要启动什么服务。说白了解压就能用。操作方式通过写类似Mysql的SQL语句对HDFS操作,提交SQL后,Hive会把SQL解析成MapReduce程序去执行,分布式多台机器并行的执行。当数据存入到HDFS后,大部分统计工作都可以通过写Hive SQL的方式来完成,大大提高了工作效率。

二、Hive安装部署

Hive的安装部署非常简单,因为它本身是Hadoop的一个客户端,不是一个集群服务。所以把安装包解压,改改配置就可以用。在哪台机器上登陆Hive客户端就在哪台机器上部署就可以了,不用在每台服务器上都部署。安装过程如下:

#上传hive.tar.gz到/home/hadoop/software/hadoop2

cd /home/hadoop/software/hadoop2

tar xvzf hive.tar.gz

cd hive/conf

mv hive-env.sh.template hive-env.sh

mv hive-default.xml.template hive-site.xml

vim …/bin/hive-config.sh

#增加:

export JAVA_HOME=/home/hadoop/software/jdk1.8.0_121

export HIVE_HOME=/home/hadoop/software/hadoop2/hive

export HADOOP_HOME=/home/hadoop/software/hadoop2

1.然后修改hive-site.xml文件

修改以下配置字节点,主要是配置Hive的元数据存储用Mysql,因为默认的是Derby文件数据库,实际公司用的时候都是改成用Mysql数据库。

vim hive-site.xml

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://192.168.1.166:3306/chongdianleme_hive?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name><value>root</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>123456</value>

</property>

<property>

<name>hive.metastore.schema.verification</name>

<value>false</value>

<description>

</description>

</property>

因为Hive默认没有把Mysql的驱动jar包集成进去,需要我们手动上传mysql-connector-java-.-bin.jar到/home/hadoop/software/hadoop2hive/lib目录下,Hive客户端启动的时候会自动加载这个目录下的所有jar包。

部署就这么简单,我们在Linux的客户端输入Hive回车就进去控制台命令窗口,后面就可以建表、查询数据、更新等操作了。下面我们看下Hive的常用SQL操作。

三、Hive SQL操作

Hive做查询数据、更新数据前提需要先建表,有了表之后我们可以往表里写入数据,之后才可以查询和更新等操作。

1.建表操作

#建Hive表脚本

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog_tab(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#EXTERNAL关键词意思创建外部表,目的是外部表当您drop table 的时候数据不会删除,只会删掉表结构而已,表结构又叫做元数据。想恢复表结构只需要把这个表再创建一次就行,里面的数据还存在。所以为了保险防止误操作,一般Hive数据仓库都建外部表。

TERMINATED BY ‘\t’ #列之间分隔符

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;#数据存储路径

#建表就这么简单,但建表之前得先建数据库,数据库的创建命令:

create database chongdianleme;

然后选择这个数据库:use chongdianleme;

#Hive建表的字段类型如下:

#基础数据类型:

Hive类型        说明         java类型      实例

1).tinyint 1byte有符号的整数    byte 20

2).smalint 2byte有符号的整数   short 20

3).int 4byte有符号的整数   int 20

4).bigint 8byte有符号的整数   long 20

5).boolean     布尔类型true或false boolean true

6).float      单精度         float 3.217

7).double    双精度         double 3.212

8).string      字符序列,单双即可   string ‘chongdianleme’;

9).timestamp    时间戳,精确的纳秒 timestamp ‘158030219188’

10).binary      字节数组        byte[]

#集合数据类型:

hive类型      说明           java类型         实例

1).struct 对象类型,可以通过字段名.元素名来访问object struct(‘name’,‘age’)

2).map 一组键值对的元组 map map(‘name’,‘zhangsan’,‘age’,‘23’)

3).array    数组  array array(‘name’,‘age’)

4).union          组合

#输入hive回车,执行创建表命令

#创建数据库命令

create database chongdianleme;

#使用这个数据库

use chongdianleme;

示例:

#ods层事实表用户查看点击课程日志:

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog_tab(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog_tab/’;

#ods层维表课程商品表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product_tab(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\t’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product_tab/’;

2.创建表之后我们就可以做一些查询数据表的操作

1)查询课程日志表前几条记录

select * from ods_kc_fact_clicklog_tab limit 6;

2)导入一些数据到课程日志表

因为开始表里没数据,我们需要先导入数据进去。有多种方式导入,比如

(1)用Sqoop工具从Mysql导入;

(2)直接把文本文件放到Hive对应的HDFS目录下。

cd /home/hadoop/chongdianleme

#rz上传

#通过Hadoop命令上传本地文件到hive表对用的hdfs目录:

hadoop fs -put kclog.txt /ods/kc/fact/ods_kc_fact_clicklog_tab/

#查看下此目录,可以看到在这个Hive表目录下有数据了:

$ hadoop fs -ls /ods/kc/fact/ods_kc_fact_clicklog_tab/

Found 1 items

-rw-r–r-- 3 hadoop supergroup 590 2019-05-29 02:16 /ods/kc/fact/ods_kc_fact_clicklog_tab/kclog.txt

#通过Hadoop的tail命令我们可以查看此目录的文件最后几条记录:

$ hadoop fs -tail /ods/kc/fact/ods_kc_fact_clicklog_tab/kclog.txt

u001 kc61800001 2019-06-02 10:01:16

u001 kc61800002 2019-06-02 10:01:17

u001 kc61800003 2019-06-02 10:01:18

u002 kc61800006 2019-06-02 10:01:19

u002 kc61800007 2019-06-02 10:01:20

#然后上传课程商品表

cd /home/hadoop/chongdianleme

#rz上传

hadoop fs -put product.txt /ods/kc/dim/ods_kc_dim_product_tab/

#查看记录

hadoop fs -tail /ods/kc/dim/ods_kc_dim_product_tab/product.txt

3)简单的查询课程日志表SQL语句

#查询前几条

select * from ods_kc_fact_clicklog_tab limit 6;

#查询总共有多少条记录

select count(1) from ods_kc_fact_clicklog_tab;

#查看有多少用户

select count(distinct userid) from ods_kc_fact_clicklog_tab;

#查看某个用户的课程日志

select * from ods_kc_fact_clicklog_tab where userid=‘u001’;

#查看大于等于某个时间的日志

select * from ods_kc_fact_clicklog_tab where time>=‘2019-06-02 10:01:19’;

#查看在售,并且价格大于2000的日志

select * from ods_kc_dim_product where issale=‘1’ and price>2000;

#查看在售,或者价格大于2000的日志

select * from ods_kc_dim_product where issale=‘1’ or price>2000;

4)以\001分隔符建表

#以\001分割是Hive建表中常用的规范,之前用的\t分隔符容易被用户输入,数据行里如果存在\t分隔符,会和Hive表里的\t分隔符混淆,这样这一行数据会多出几列,造成列错乱。

#ods层维表用户查看点击课程日志事实表:

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#ods层维表用户查看点击课程基本信息维度表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

5)基于SQL查询结果集来更新数据表

#把查询sql语句的结果集合导出到另外一张表,用insert overwrite table

这是更新数据表的常用方式,通过insert overwrite table可以把指定的查询结果集合插入到这个表,插入前先把表清空。如果不加overwrite关键词,就不会清空,而是在原来的数据上追加。

#先查询下ods_kc_fact_clicklog这个表有没有记录。

select * from chongdianleme.ods_kc_fact_clicklog limit 6;

#把查询结果导入到这个\001分割的表,课程日志表

insert overwrite table chongdianleme.ods_kc_fact_clicklog select userid,kcid,time from chongdianleme.ods_kc_fact_clicklog_tab;

#再查看下导入的结果

select * from chongdianleme.ods_kc_fact_clicklog limit 6;

#课程商品表

insert overwrite table chongdianleme.ods_kc_dim_product select kcid,kcname,price,issale from chongdianleme.ods_kc_dim_product_tab;

#查看课程商品表

select * from chongdianleme.ods_kc_dim_product limit 36;

select * from ods_kc_dim_product where price>2000;

6)join关联查询–自然连接

#join关联查询可以把多个表以某个字段作为关联,同时获得多个表的字段数据,关联不上的数据将会丢弃。

#查询下在售课程的用户访问日志

select a.userid,a.kcid,b.kcname,b.price,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

7)left join关联查询–左连接

#left join关联查询和自然连接的区别,左边的表的没有关联上的数据记录不会丢弃,只是对应的右表那些记录是空值而已。

#查询下在售课程的用户访问日志

select a.userid,a.kcid,b.kcname,b.price,a.time,b.kcid from chongdianleme.ods_kc_fact_clicklog a left join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.kcid is null;

8)full join关联查询—完全连接

#full join关联查询不管有没有关联上,所有的数据记录都会丢弃,关联不上只是显示为空而已。

#查询下在售课程的用户访问日志

select a.userid,a.kcid,b.kcname,b.price,a.time,b.kcid from chongdianleme.ods_kc_fact_clicklog a full join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid;

9)导入关联表SQL结果到新表

#创建要导入的表数据

create EXTERNAL table IF NOT EXISTS ods_kc_fact_etlclicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_etlclicklog/’;

#把查询集合的结果更新到刚才创建的表里ods_kc_fact_etlclicklog,先清空,在导入。如果不想清空而是想追加数据把overwrite关键词去掉就可以了。

insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

上面的SQL语句都是在Hive客户端操作的,SQL语句根据数据量和复杂程度不同,快的话如果不触发MapReduce计算只需要几毫秒,如果触发了最快也得几秒左右。一般情况下执行几分钟或几个小时很正常。对于执行时间长的SQL语句,客户端的电脑如果断电或网络中断,SQL语句的执行可能也会重点,没有完全跑完整个SQL。所以这种情况我们可以用一个Shell脚本把需要执行的SQL都放在里面,以后就可以用nohup后台的方式去执行这个脚本。

3.通过Shell脚本执行Hive的SQL语句来实现ETL

#创建demohive.sql文件

#把insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

insert overwrite table chongdianleme.ods_kc_dim_product select kcid,kcname,price,issale from chongdianleme.ods_kc_dim_product_tab;

#加进去,每个SQL语句后面记得加;分号。

#创建demoshell.sh文件

#加入:echo “通过shell脚本执行hive sql语句”

/home/hadoop/software/hadoop2/hive/bin/hive -f /home/hadoop/chongdianleme/demohive.sql;

sh demoshell.sh

#或者

sudo chmod 755 demoshell.sh

./demoshell.sh

#以nohup后台进程方式执行Shell脚本,防止xshell客户端由于断网或者下班后关机或关闭客户端而导致sql执行半截退出。

#创建nohupdemoshell.sh文件:

#echo “–nohup后台方式执行脚本,断网、关机、客户端关闭无需担忧执行脚本中断”;

nohup /home/hadoop/chongdianleme/demoshell.sh >>/home/hadoop/chongdianleme/log.txt 2>&1 &

#然后执行可能报错:

nohup: 无法运行命令’/home/hadoop/chongdianleme/demoshell.sh’: #权限不够

#是因为脚本是不可执行文件。

sudo chmod 755 demoshell.sh

sudo chmod 755 nohupdemoshell.sh

#然后tail -f log.txt就可以看到实时执行日志。

实际上我们用Hive做ETL数据处理都可以用这种方式,通过Shell脚本来执行Hive SQL,并且是定时触发,定时触发有几种方式,最简单的方式用Linux系统自带的crontab调度。但crontab调度不支持复杂的任务依赖。这个时候可以用Azkaban、Oozie来调度。互联网公司使用最普遍的是Azkaban调度。

4.crontab调度定时执行脚本

这是Linux自带的本地系统调度工具,简单好用。通过crontab表达式定时触发一个shell脚本。

#Crontab调度举例

crontab -e

16 1,2,23 * * * /home/hadoop/chongdianleme/nohupdemoshell.sh

然后保存,重启cron服务。

sudo service cron restart

5.Azkaban调度

Azkaban是一套简单的任务调度服务,整体包括三部分webserver、dbserver、executorserver。Azkaban是linkin的开源项目,开发语言为Java。Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的Web用户界面维护和跟踪你的工作流。

Azkaban实际当中经常有这些场景:每天有一个大任务,这个大任务可以分成A,B,C,D四个小任务,A,B任务之间没有依赖关系,C任务依赖A,B任务的结果,D任务依赖C任务的结果。一般的做法是,开两个终端同时执行A,B,两个都执行完了再执行C,最后再执行D。这样的话,整个的执行过程都需要人工参加,并且得盯着各任务的进度。但是我们的很多任务都是在深更半夜执行的,通过写脚本设置crontab执行。其实,整个过程类似于一个有向无环图(DAG)。每个子任务相当于大任务中的一个流,任务的起点可以从没有度的节点开始执行,任何没有通路的节点之间可以同时执行,比如上述的A,B。总结起来的话,我们需要的就是一个工作流的调度器,而azkaban就是能解决上述问题的一个调度器。

6.Oozie调度

Oozie是管理Hadoop作业的工作流调度系统,Oozie的工作流是一系列的操作图,Oozie协调作业是通过时间(频率)以及有效数据触发当前的Oozie工作流程,Oozie是针对Hadoop开发的开源工作流引擎,专门针对大规模复杂工作流程和数据管道设计。Oozie围绕两个核心:工作流和协调器,前者定义任务的拓扑和执行逻辑,后者负责工作流的依赖和触发。

这节我们讲的Hive常用SQL,Hive SQL能满足多数应用场景,但有的时候想和自己的业务代码做混合编程,实现复杂的功能,就需要自定义开发Java函数,也就是我们下面要讲的UDF函数。

UDF函数

Hive SQL一般满足多数应用场景,但是有的时候通过SQL实现比较复杂,用一个函数实现会大大简化SQL的逻辑,在就是通过自定义函数能够和业务逻辑结合在一块,实现更复杂的功能。

1.Hive类型

Hive中有三种UDF:

1) 用户定义函数(user-defined function)UDF

UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类,比如数学函数和字符串函数。简单来说UDF返回对应值,一对一。

2) 用户定义聚集函数(user-defined aggregate function,UDAF)

UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。简单来说UDAF返回聚类值,多对一。

3)用户定义表生成函数(user-defined table-generating function,UDTF)

UDTF 操作作用于单个数据行,并且产生多个数据行一个表作为输出。简单来说UDTF返回拆分值,一对多。

实际工作中UDF用的最多,下面我们重点讲一下第一种UDF函数,也就是用户定义函数(user-defined function)UDF,我们统一简称为UDF。

2.UDF自定义函数

Hive的SQL给数据挖掘工作者带来了很多便利,海量数据通过简单的SQL就可以完成分析,有时候Hive提供的函数功能满足不了业务需要,就需要我们自己来写UDF函数来辅助完成。UDF函数其实就是一个简单的函数,执行过程就是在Hive转换成MapReduce程序后,执行Java方法,类似于像MapReduce执行过程中加入一个插件,方便扩展。 UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF。Hive可以允许用户编写自己定义的函数UDF,来在查询中使用。我们自定义开发UDF函数的时候继承org.apache.hadoop.hive.ql.exec.UDF类即可,代码如下所示:

package com.chongdianleme.hiveudf.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

//自定义类继承UDF

public class HiveUDFTest extends UDF {

//字符串统一转大写字符串示例

public String evaluate (String str){

if(str==null || str.toString().isEmpty()){

return new String();

}

return new String(str.trim().toUpperCase());

}

}

下面看下怎么部署,部署也分临时部署和永久生效部署方式,我们分别来看下。

3.临时部署测试

部署脚本代码如下所示:

#把程序打包放到目标机器上去;

#进入hive客户端,添加jar包:

hive>add jar /home/hadoop/software/task/HiveUDFTest.jar;

#创建临时函数:

hive>CREATE TEMPORARY FUNCTION ups AS ‘hive.HiveUDFTest’;

add jar /home/hadoop/software/task/udfTest.jar;

create temporary function row_toUpper as ‘com.chongdianleme.hiveudf.udf.HiveUDFTest’;

4.永久全局方式部署

线上永久配置方式,部署脚本代码如下所示:

cd /home/hadoop/software/hadoop2/hive

#创建auxlib文件夹

cd auxlib

#在/home/hadoop/software/hadoop2/hive/auxlib上传udf函数的jar包。hive sql执行时会自动扫描/data/software/hadoop/hive/auxlib下的jar包。

cd /home/hadoop/software/hadoop2/hive/bin

#显示隐藏文件

ls -a

#编辑vi .hiverc文件加入

create temporary function row_toUpper as ‘com.chongdianleme.hiveudf.udf.HiveUDFTest’;

之后通过输入hive命令登录客户端就可以了,客户端会自动扫描加载所有的UDF函数。以上我们讲的Hive常用SQL和UDF,以及怎么用Shell脚本触发执行SQL,怎么去做定时的调度。实际工作中,并不是盲目随意的去建表,一般都会制定一个规范,大家遵守这个规则去执行。这个规范就是我们下面要讲的数据仓库规范和模型设计。

Hive 数据仓库模型设计

数据仓库模型设计就是要制定一个规范,这个规范一般是做数据仓库的分层设计。我们要搭建数据仓库,把握好数据质量,对数据进行清洗、转换。那么更好区分那个是原始数据,那个是清洗后的数据,我们最好做一个数据分层,方便我们快速的找到想要的数据。另外,有些高频的数据不需要每次都重复计算,只需要计算一次放在一个中间层里,供其他业务模块复用,这样节省时间,同时也减少的服务器资源的消耗。数据仓库分层设计还有其他很多好处,下面举一个实例看看如何分层。

数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

我们在看下什么是数据集市,数据集市(Data Mart) ,也叫数据市场,数据集市就是满足特定的部门或者用户的需求,按照多维的方式进行存储,包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体。从范围上来说,数据是从企业范围的数据库、数据仓库,或者是更加专业的数据仓库中抽取出来的。数据中心的重点就在于它迎合了专业用户群体的特殊需求,在分析、内容、表现,以及易用方面。数据中心的用户希望数据是由他们熟悉的术语表现的。

上面我们说的是数据仓库和数据集市的概念,简单来说,在Hadoop平台上的整个Hive的所有表构成了数据仓库,这些表有时分层设计的,我们可以分为四层,ods层、mid层、tp临时层、数据集市层。其中数据集市可以看做数据仓库的一个子集,一个数据集市往往是针对一个项目的,比如推荐的叫推荐集市,做用户画像的项目叫用户画像集市。ods是基础数据层,也是原始数据层,是最底层的,数据集市是偏最上游的数据层。数据集市的数据可以直接让项目使用,不用再更多的去加工了。

数据仓库的分层体现在Hive数据表名上,Hive存储对应的HDFS目录最好和表名一致,这样根据表名也能快速的找到目录,当然这不是必须的。一般大数据平台都会创建一个数据字典平台,在Web的界面上能够根据表名找到对应的表解释,比如表的用途,字段表结构,每个字段代表什么意思,存储目录等。而且能查询到表和表之间的血缘关系。说到血缘关系在数据仓库里经常会提起。我在下面会单独讲一小节。下面我用实例讲下推荐的数据仓库。

首先我们需要和部门所有的人制定一个建表规范,大家统一遵守这个规则:

1.建表规范

以下建表规范仅供参考,可以根据每个公司的实际情况来定:

1) 统一创建外部表

外部表的好处是当你不小心删除了这个表,但数据还会保留下来,如果是误删除,会很快的找回来,只需要把建表语句在创建一遍即可。

2)统一分四级,以下划线分割

分为几个级别没有明确的规定,一般分为四级的情况比较多。

3)列之间分隔符统一’\001’

用\001分割的目标是为了避免因为数据也存在同样的分隔符造成列的错乱问题。因为\001分割符是用户无法输入的,之前用的\t分隔符容易被用户输入,数据行里如果存在\t分隔符,会和Hive表里的\t分隔符混淆,这样这一行数据会多出几列,造成列错乱。

4)location指定目录统一以/结尾

指定目录统一以/结尾代表最后是一个文件夹,而不是一个文件。一个文件夹下面可以有很多文件,如果数据特别大,适合拆分成多个小文件。

5)stored类型统一textfile

每个公司实际情况不太一样,textfile是文本文件类型,好处是方便查看内容,不好的地方是占用空间较多。

6)表名和location指定目录保持一致

表名和location指定目录保持一致的主要目的是方便看见表名就马上知道对应的数据存储目录在哪里,方便检索和查找。

#下面列举一个建表的例子给大家做一个演示

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

2.数据仓库分层设计规范

上面我们建表的时候已经说了分为四级,也就是说我们的数据仓库分为四层,也就是操作数据存储原始数据层ODS、middle中间层、tp临时层、数据集市层等,下面我们一一讲解。

1)ODS层

说明:操作数据存储ODS(Operational Data Store)用来存放原始基础数据,比如维表、事实表。以下划线分为四级,

(1)原始数据层

(2)项目名称(kc代表视频课程类项目,Read代表阅读类文章)

(3)表类型(dim维度表fact事实表)

(4)表名

举几个例子:

#原始数据_视频课程_事实表_课程访问日志表

create EXTERNAL table IF NOT EXISTS ods_kc_fact_clicklog(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/fact/ods_kc_fact_clicklog/’;

#ods层维表课程基本信息表:

create EXTERNAL table IF NOT EXISTS ods_kc_dim_product(kcid string,kcname string,price float ,issale string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/ods/kc/dim/ods_kc_dim_product/’;

这里涉及到一个概念,什么是维表、事实表?

事实表:

在多维数据仓库中,保存度量值的详细值或事实的表称为“事实表”。事实数据表通常包含大量的行。事实数据表的主要特点是包含数字数据(事实),并且这些数字信息可以汇总,以提供有关单位作为历史的数据,每个事实数据表包含一个由多个部分组成的索引,该索引包含作为外键的相关性纬度表的主键,而维度表包含事实记录的特性。事实数据表不应该包含描述性的信息,也不应该包含除数字度量字段及使事实与纬度表中对应项的相关索引字段之外的任何数据。

维度表:

维度表可以看作是用户来分析数据的窗口,纬度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。在维度表中,每个表都包含独立于其他维度表的事实特性,例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。维度表包含了维度的每个成员的特定名称。维度成员的名称称为“属性”(Attribute)。

在我们的推荐场景,比如这个课程访问日志表ods_kc_fact_clicklog,都是用户访问课程的大量日志,针对每条记录也没有一个实际意义的主键,同一个用户有多条课程访问记录,同一个课程也会别多个用户访问,这个表就是事实表。课程基本信息表ods_kc_dim_product,每个课程都有一个唯一的课程主键,课程具有唯一性。每个课程都有基本属性。这个表就是维表。

2)mid层

说明:middle中间层,从ods层中join多表或某一段时间内的小表计算生成的中间表,再后续的集市层中频繁使用。用来一次生成多次使用,避免每次关联多个表重复计算。

从ODS层提取数据到集市层常用SQL方式:

#把某个select的查询结果集覆盖到某个表,相当于truncate和insert的操作。

insert overwrite table chongdianleme.ods_kc_fact_etlclicklog select a.userid,a.kcid,a.time from chongdianleme.ods_kc_fact_clicklog a join chongdianleme.ods_kc_dim_product b on a.kcid=b.kcid where b.issale=1;

3)tp临时层

说明:temp临时层简称tp,临时生成的数据统一放在这层。系统默认有一个/tmp目录,不要放在这里目录,这个目录很多是Hive本身自己存放在的临时层,我们不要跟它混在一起

#建表举例:

create EXTERNAL table IF NOT EXISTS tp_kc_fact_clicklogtotemp(userid string,kcid string,time string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/tp/kc/fact/tp_kc_fact_clicklogtotemp/’;

4)数据集市层

比如,用户画像集市,推荐集市,搜索集市等。说明:存放搜索项目数据,集市数据一般是中间层和ods层关联表计算,或使用Spark程序处理开发算出来的数据。

#用户画像集市建表举例:

create EXTERNAL table IF NOT EXISTS personas_kc_fact_userlog(userid string,kcid string,name string,age string,sex string)

ROW FORMAT DELIMITED FIELDS

TERMINATED BY ‘\001’

stored as textfile

location ‘/personas/kc/fact/personas_kc_fact_userlog/’;

从开发人员的角色,是有专门的数据仓库工程师来负责,当然如果预算有限,也可以有大数据ETL工程师来负责。

Hive非常适合离线的数据处理分析,但有些场景需要对数据做实时处理,而Hbase数据库特别适合处理实时数据。

总结

此文章有对应的配套视频,其它更多精彩文章请大家下载充电了么app,可获取千万免费好课和文章,配套新书教材请看陈敬雷新书:《分布式机器学习实战》(人工智能科学与技术丛书)

【新书介绍】
《分布式机器学习实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目

【新书介绍视频】
分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】
视频特色:重点对新书进行介绍,最新前沿技术热点剖析,技术职业规划建议!听完此课你对人工智能领域将有一个崭新的技术视野!职业发展也将有更加清晰的认识!

【精品课程】
《分布式机器学习实战》大数据人工智能AI专家级精品课程

【免费体验视频】:
人工智能百万年薪成长路线/从Python到最新热点技术

从Python编程零基础小白入门到人工智能高级实战系列课

视频特色: 本系列专家级精品课有对应的配套书籍《分布式机器学习实战》,精品课和书籍可以互补式学习,彼此相互补充,大大提高了学习效率。本系列课和书籍是以分布式机器学习为主线,并对其依赖的大数据技术做了详细介绍,之后对目前主流的分布式机器学习框架和算法进行重点讲解,本系列课和书籍侧重实战,最后讲几个工业级的系统实战项目给大家。 课程核心内容有互联网公司大数据和人工智能那些事、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)、就业/面试技巧/职业生涯规划/职业晋升指导等内容。

【充电了么公司介绍】

充电了么App是专注上班族职业培训充电学习的在线教育平台。

专注工作职业技能提升和学习,提高工作效率,带来经济效益!今天你充电了么?

充电了么官网
http://www.chongdianleme.com/

充电了么App官网下载地址
https://a.app.qq.com/o/simple.jsp?pkgname=com.charged.app

功能特色如下:

【全行业职位】 - 专注职场上班族职业技能提升

覆盖所有行业和职位,不管你是上班族,高管,还是创业都有你要学习的视频和文章。其中大数据智能AI、区块链、深度学习是互联网一线工业级的实战经验。

除了专业技能学习,还有通用职场技能,比如企业管理、股权激励和设计、职业生涯规划、社交礼仪、沟通技巧、演讲技巧、开会技巧、发邮件技巧、工作压力如何放松、人脉关系等等,全方位提高你的专业水平和整体素质。

【牛人课堂】 - 学习牛人的工作经验

1.智能个性化引擎:

海量视频课程,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习课程。

2.听课全网搜索

输入关键词搜索海量视频课程,应有尽有,总有适合你的课程。

3.听课播放详情

视频播放详情,除了播放当前视频,更有相关视频课程和文章阅读,对某个技能知识点强化,让你轻松成为某个领域的资深专家。

【精品阅读】 - 技能文章兴趣阅读

1.个性化阅读引擎:

千万级文章阅读,覆盖所有行业、所有职位,通过不同行业职位的技能词偏好挖掘分析,智能匹配你目前职位最感兴趣的技能学习文章。

2.阅读全网搜索

输入关键词搜索海量文章阅读,应有尽有,总有你感兴趣的技能学习文章。

【机器人老师】 - 个人提升趣味学习

基于搜索引擎和智能深度学习训练,为您打造更懂你的机器人老师,用自然语言和机器人老师聊天学习,寓教于乐,高效学习,快乐人生。

【精短课程】 - 高效学习知识

海量精短牛人课程,满足你的时间碎片化学习,快速提高某个技能知识点。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈敬雷-充电了么-CEO兼CTO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值