柚子快报邀请码778899分享:数据仓库 Hive数仓模型

http://yzkb.51969.com/

Hive数仓模型

1、hive数据分层

ODS层——原始数据

来自业务库、埋点日志、消息队列等

业务库:sqoop定时抽取数据;实时方面考虑使用canal监听mysql的binlog日志,实时接入即可埋点日志:日志一般是以文件的形式保存,可以选择使用flume来定时同步;可以使用spark streaming或者Flink、Kafka来实时接入消息队列:来自ActiveMQ、Kafka的数据等

DWD层——数据细节层

进行数据清洗和规范化操作;去空、脏数据,离群值等,数据清洗。

DWM层——数据中间层【中间表】

在DWD的基础上进行轻微聚合操作,算出相应的统计指标

DWS——数据服务层

该层是基于DWM上的基础数据,整合汇总成分析某一个主题域的数据服务层,一般是宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

ADS层——数据应用层

该层主要是提供给数据产品和数据分析使用的数据,一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用;也可能存放在hive或者Druid中,供数据分析和数据挖掘使用,比如常用的数据报表就是存在这里的。

事实表:系统日志、销售记录等,事实记录的表的记录会不断增长。 维度表:与事实表对应的一种 表,例如日期表、地点表。

2、数仓过程

HIve是什么

Hive是Hadoop生态的数据仓库工具;Hive将存储在HDFS上的文件映射为关系表;通过解析开发者提交的SQL语句,将SQL转换成MR任务,提交到Hadoop执行;Hive提供了命令行客户端和JDBC。

一、采集日志 Flume

# 数据输出打印到logger控制台

a1.sinks.k1.type = hdfs

a1.sinks.k1.hdfs.path = hdfs://xgh0791:8020/flume/events/%Y-%m-%d

a1.sinks.k1.hdfs.useLocalTimeStamp = true

a1.sinks.k1.hdfs.fileType = DataStream

a1.sinks.k1.hdfs.writeFormat = Text

# 流速

a1.sinks.k1.hdfs.rollInterval = 100

a1.sinks.k1.hdfs.rollSize = 1340000000

# Bind the source and sink to the channel

a1.sinks.k1.hdfs.rollCount = 0

a1.sinks.k1.hdfs.filePrefix = shopping_data

a1.sinks.k1.hdfs.fileSuffix = .txt

a1.channels.c1.type = memory

a1.channels.c1.capacity = 1000

a1.channels.c1.transactionCapacity = 100

# Bind the source and sink to the channel

a1.sources.r1.channels = c1

a1.sinks.k1.channel = c1

二、数据清洗

2.1 建立源数据表ODS[单列]

-- 创建ods层 单列

-- 创建表

create external table meituan

(

line string

)

-- 默认路径 user/hive/warehouse

location 'hdfs://xgh0791:8020/flume/events/2024-05-06';

2.2 建立数据明细层DWD层[多列]

-- 创建dwd层

-- 表的格式化 字段

create external table if not exists dp_dwd

(

id int, --店铺id 0

province STRING, --省份 1

city STRING, --城市 2

name STRING, --店铺名字 3

address STRING, --店铺地址 4

phone STRING, --电话 5

category STRING, --食物的类型 8

score STRING, --店铺评分 9

month_sales int, --月销量 11

avg_price string, --人均价格 12

min_price string, --起送费 13

menu_categories string, --菜单种类 22

updated date --更新的时间 24

);

-- 插入数据

insert overwrite table dp_dwd

select arr[0] id,

arr[1] province,

arr[2] city,

arr[3] name,

arr[4] address,

arr[5] phone,

arr[8] category,

arr[9] score,

cast(regexp_replace(substr(arr[11], 3), '[^0-9]+', '') as int) month_sales,

arr[12] avg_price,

arr[13] min_price,

arr[22] menu_categories,

arr[24] updated

from (select split(line, "\t") arr from meituan) t;

-- 删除原第一行

alter table dp_dwd set tblproperties ('skip.header.line.count'='1');

2.3 DWM数据中间层【多表】

该层是在DWD层的数据基础上,对数据做一些轻微的聚合操作,生成一些列的中间结果表,提升公共指标的复用性,减少重复加工的工作。

2.4 DWS 数据服务层【宽表层】

-- 创建dws层

-- 查询每个省份的餐馆月销量最高的餐馆

SELECT province,

name,

month_sales

FROM (SELECT province,

name,

month_sales,

RANK() OVER (PARTITION BY province ORDER BY month_sales DESC) as rank

FROM dp_dwd) ranked

WHERE rank = 1;

2.5 ADS层 数据应用层

该层主要是提供给数据产品和数据分析使用的数据,一般会存放在ES、Redis、PostgreSql等系统中供线上系统使用;也可能存放在hive或者Druid中,供数据分析和数据挖掘使用,比如常用的数据报表就是存在这里的。

3、Hive函数

-- 查看函数的详细用法(包含案例)

desc function extended substr;

常用的函数

空字段赋值 case when then else end 行转列 列转行 窗口函数(开窗函数)

OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

CURRENT ROW:当前行

n PRECEDING:往前n行数据

n FOLLOWING:往后n行数据

UNBOUNDED:无边界

UNBOUNDED PRECEDING 前无边界,表示从前面的起点,

UNBOUNDED FOLLOWING后无边界,表示到后面的终点

LAG(col,n,default_val):往前第n行数据

LEAD(col,n, default_val):往后第n行数据

FIRST_VALUE (col,true/false):当前窗口下的第一个值,第二个参数为true,跳过空值

LAST_VALUE (col,true/false):当前窗口下的最后一个值,第二个参数为true,跳过空值

NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

4、Hive类型

基本类型

Hive数据类型Java数据类型长度例子TINYINTbyte1byte有符号整数20SMALLINTshort2byte有符号整数20INTint4byte有符号整数20BIGINTlong8byte有符号整数20BOOLEANboolean布尔类型,true或者falseTRUE FALSEFLOATfloat单精度浮点数3.14159DOUBLEdouble双精度浮点数3.14159STRINGstring字符系列。可以指定字符集。可以使用单引号或者双引号。‘now is the time’ “for all good men”TIMESTAMP-时间类型-BINARY-字节数组-

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

集合类型

数据类型描述语法示例STRUCT和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。struct()MAPMAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素map()ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。Array()

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

类型转换

Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST 操作。

隐式类型转换规则如下。任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT。所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。TINYINT、SMALLINT、INT都可以转换为FLOAT。BOOLEAN类型不可以转换为任何其它的类型。可以使用CAST操作显示进行数据类型转换,例如CAST(‘1’ AS INT)将把字符串’1’ 转换成整数1;如果强制类型转换失败,如执行CAST(‘X’ AS INT),表达式返回空值 NULL。

柚子快报邀请码778899分享:数据仓库 Hive数仓模型

http://yzkb.51969.com/

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: