热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hivetimestamp转化为string_Hive数据仓库实战

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

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

javax.jdo.option.ConnectionURL

jdbc:mysql://192.168.1.166:3306/chongdianleme_hive?createDatabaseIfNotExist=true

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserNameroot

javax.jdo.option.ConnectionPassword

123456

hive.metastore.schema.verification

false

因为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数据库特别适合处理实时数据。

除了Hive数据仓库实战,其它深度学习框架也有不错的开源实现,比如MXNet,后面请大家关注充电了么app,课程,微信群,更多内容请看新书《分布式机器学习实战(人工智能科学与技术丛书)》

《分布式机器学习实战》本书对应清华大学出版社京东自营链接地址:

https://item.jd.com/12743009.html

新书介绍视频:

分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】https://ke.qq.com/course/3067704?flowToken=1029963

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

https://ke.qq.com/course/393750?flowToken=1028919

人工智能百万年薪成长路线/从Python到最新热点技术

https://ke.qq.com/course/package/31251?flowToken=1029962

Python编程零基础小白快速入门必听课

https://ke.qq.com/course/package/29782?flowToken=1028733


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 阿里云虚拟主机安装多个织梦系统的方法
    本文介绍了在阿里云虚拟主机上安装多个织梦系统的方法。通过创建不同名称的文件夹并将不同的域名解析到对应的目录,可以实现多个系统的安装。在安装过程中需要注意修改数据库前缀,并在系统设置中还原数据库。同时还介绍了阿里云虚拟主机二级域名绑定二级目录和域名重定向的用法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
author-avatar
mobiledu2502899797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有