大数据-数仓分层(五)

一、数仓分层

1.1 为什么要分层

  1. 把问题简单化:将复杂的任务分解成多层来完成,每一次只处理简单的任务,方便定位问题;
  2. 减少开发重复:规范数据分层,通过中间层数据,减少重复计算,增加计算结果的复用性
  3. 隔离原始数据:不论是数据的异常还是数据的敏感性,使真实数据和统计数据解耦

1.2 数据集市与数据仓库概念

在这里插入图片描述

1.3 数仓命名规范

1.3.1 表命名

  • ODS层命名为ods_表名
  • DWD层命名为dwd_dim/fact_表名
  • DWS层命名为dws_表名
  • DWT层命名为dwt_表名
  • ADS层命名为ads_表名
  • 临时表命名为xxx_tmp
  • 用户行为表,以log为后缀。

1.3.2 脚本命名

  • 数据源_to_目标_db/log.sh
  • 用户行为脚本以log为后缀;业务数据脚本以db为后缀。

1.3.3 表字段类型

  • 数量类型为bigint
  • 金额类型为decimal(16, 2),表示:16 位有效数字,其中小数部分 2 位
  • 字符串(名字,描述信息等)类型为string
  • 主键外键类型为string
  • 时间戳类型为bigint

二、数仓理论

2.1 关系建模与维度建模

当今的数据处理大致可以分成两大类: 联机事务处理 OLTP ( on-line transaction
processing)、联机分析处理 OLAP(On-Line Analytical Processing)。OLTP 是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP 是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。二者的主要区别对比如下表所示。

对比属性 OLTP OLAP
读特性 每次查询只返回少量记录 对大量记录进行汇总
读特性 随机、低延时写入用户的输入 批量导入
使用场景 用户,Java EE 项目 内部分析师,为决策提供支持
数据表征 最新数据状态 随时间变化的历史状态
数据规模 GB TB 到 PB

2.1.1 关系建模

在这里插入图片描述

关系模型如图所示,严格遵循第三范式(3NF),从图中可以看出,较为松散、零碎,物理表数量多,而数据冗余程度低。由于数据分布于众多的表中,这些数据可以更为灵活地被应用,功能性较强。关系模型主要应用与 OLTP 系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都是遵循第三范式的。

2.1.2 维度建模

纬度建模

维度模型如图所示,主要应用于 OLAP 系统中,通常以某一个事实表为中心进行表的组织,主要面向业务,特征是可能存在数据的冗余,但是能方便的得到数据。
关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率。所以通常我们采用维度模型建模,把相关各种表整理成两种:事实表和维度表两种。

在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型。
在这里插入图片描述
在这里插入图片描述

2.2 维度表和事实表

2.2.1 维度表

维度表:一般是对事实的描述信息。每一张维表对应现实世界中的一个对象或者概念。例如:用户、商品、日期、地区等。

维表的特征:

  • 维表的范围很宽(具有多个属性、列比较多)
  • 跟事实表相比,行数相对较小:通常< 10 万条
  • 内容相对固定:编码表

2.2.2 事实表

  事实表中的每行数据代表一个业务事件(下单、支付、退款、评价等)。“事实”这个术语表示的是业务事件的度量值(可统计次数、个数、金额等),例如,2020 年 5 月 21
日,宋宋老师在京东发了 250 块钱买了一瓶海狗人参丸。维度表:时间、用户、商品、商家。事实表:250 块钱、一瓶
  每一个事实表的行包括:具有可加性的数值型的度量值、与维表相连接的外键、通常具有两个和两个以上的外键、外键之间表示维表之间多对多的关系。

事实表的特征:

  • 非常的大
  • 内容相对的窄:列数较少(主要是外键 id 和度量值)
  • 经常发生变化,每天会新增加很多。
  1. 事务型事实表

  以每个事务或事件为单位,例如一个销售订单记录,一笔支付记录等,作为事实表里的一行数据。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。

  1. 周期型快照事实表

  周期型快照事实表中不会保留所有数据,只保留固定时间间隔的数据,例如每天或者每月的销售额,或每月的账户余额等。
  例如购物车,有加减商品,随时都有可能变化,但是我们更关心每天结束时这里面有多少商品,方便我们后期统计分析。

  1. 累积型快照事实表

累计快照事实表用于跟踪业务事实的变化。例如,数据仓库中可能需要累积或者存储订单从下订单开始,到订单商品被打包、运输、和签收的各个业务阶段的时间点数据来跟踪订单声明周期的进展情况。当这个业务过程进行时,事实表的记录也要不断更新。

2.3 数据仓库建模

2.3.1 ODS 层

  1. HDFS 用户行为数据
    在这里插入图片描述
  2. HDFS 业务数据
    在这里插入图片描述
  3. 针对 HDFS 上的用户行为数据和业务数据,我们如何规划处理?
    (1)保持数据原貌不做任何修改,起到备份数据的作用。
    (2)数据采用压缩,减少磁盘存储空间(例如:原始数据 100G,可以压缩到 10G 左
    右)
    (3)创建分区表,防止后续的全表扫描

2.3.2 DWD 层

DWD 层需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型。
维度建模一般按照以下四个步骤:选择业务过程→声明粒度→确认维度→确认事实

  1. 选择业务过程
      在业务系统中,挑选我们感兴趣的业务线,比如下单业务,支付业务,退款业务,物流业务,一条业务线对应一张事实表。
      如果是中小公司,尽量把所有业务过程都选择。
      如果是大公司(1000 多张表),选择和需求相关的业务线。

  2. 声明粒度
      数据粒度指数据仓库的数据中保存数据的细化程度或综合程度的级别。
      声明粒度意味着精确定义事实表中的一行数据表示什么,应该尽可能选择最小粒度,以此来应各种各样的需求。
    典型的粒度声明如下:
      订单当中的每个商品项作为下单事实表中的一行,粒度为每次。每周的订单次数作为一行,粒度为每周。
      每月的订单次数作为一行,粒度为每月。
      如果在 DWD 层粒度就是每周或者每月,那么后续就没有办法统计细粒度的指标了。所以建议采用最小粒度。

  3. 确定维度
      维度的主要作用是描述业务是事实,主要表示的是“谁,何处,何时”等信息。
      确定维度的原则是:后续需求中是否要分析相关维度的指标。例如,需要统计,什么时间下的订单多,哪个地区下的订单多,哪个用户下的订单多。需要确定的维度就包括:时间维度、地区维度、用户维度。
      维度表:需要根据维度建模中的星型模型原则进行维度退化。

  4. 确定事实
      此处的“事实”一词,指的是业务中的度量值(次数、个数、件数、金额,可以进行累加),例如订单金额、下单次数等。
      在 DWD 层,以业务过程为建模驱动,基于每个具体业务过程的特点,构建最细粒度的明细层事实表。事实表可做适当的宽表化处理。
      事实表和维度表的关联比较灵活,但是为了应对更复杂的业务需求,可以将能关联上的表尽量关联上。如何判断是否能够关联上呢?在业务表关系图中,只要两张表能通过中间表能够关联上,就说明能关联上。
    在这里插入图片描述

2.3.3 DWS 层

DWS 层统计各个主题对象的当天行为,服务于 DWT 层的主题宽表。

(1)问题引出:两个需求,统计每个省份订单的个数、统计每个省份订单的总金额
(2)处理办法:都是将省份表和订单表进行 join,group by 省份,然后计算。相当于类似的需求重复计算了两次。
那怎么设计能避免重复计算呢?
地区宽表的字段设计为:下单次数、下单金额、支付次数、支付金额等。只需要和每个事实表一次 join。
(3)总结:
需要建哪些表:以维度为基准,去关联对应多个事实表
宽表里面的字段:是站在不同维度的角度去看事实表,重点关注事实表聚合后的度量值。
(4)DWS 层宽表包括:每日设备行为、每日会员行为、每日商品行为、每日活动统计、每日地区统计。

2.3.4 DWT 层

DWT 层统计各个主题对象的累积行为。
(1)需要建哪些表:和 DWS 层一样。以维度为基准,去关联对应多个事实表
(2)宽表里面的字段:我们站在维度表的角度去看事实表,重点关注事实表度量值的累积值、事实表行为的首次和末次时间。
例如,订单事实表的度量值是下单次数、下单金额。订单事实表的行为是下单。我们站在用户维度表的角度去看订单事实表,重点关注订单事实表至今的累积下单次数、累积下单金额和某时间段内的累积次数、累积金额,以及关注下单行为的首次时间和末次时间。

2.3.5 ADS 层

对电商系统各大主题指标分别进行分析。

三、Hive 环境准备

3.1 Hive 引擎简介

  Hive 引擎包括:默认 MR、tez、spark
Hive on Spark:Hive 既作为存储元数据又负责 SQL 的解析优化,语法是 HQL 语法,执行引擎变成了Spark,Spark 负责采用 RDD 执行。
  Spark on Hive : Hive 只作为存储元数据,Spark 负责 SQL 解析优化,语法是 Spark SQL
语法,Spark 负责采用 RDD 执行。

3.2 Hive安装

3.2.1 hive环境准备

  1. 把 apache-hive-3.1.2-bin.tar.gz 上传到 linux 的/opt/software 目录下
    在这里插入图片描述

  2. 解压 apache-hive-3.1.2-bin.tar.gz 到/opt/module/目录下面

tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/
  1. 修改 apache-hive-3.1.2-bin.tar.gz 的名称为 hive
mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive

4)修改/etc/profile.d/my_env.sh,添加环境变量

[root@hadoop102 software]$ vim /etc/profile.d/my_env.sh

添加内容

#HIVE_HOME
export HIVE_HOME=/opt/module/hive 
export PATH=$PATH:$HIVE_HOME/bin

重启 Xshell 对话框或者 source 一下 /etc/profile.d/my_env.sh 文件,使环境变量生效

[root@hadoop102 software]$ source /etc/profile.d/my_env.sh	

3.2.2 Hive 元数据配置到MySQL

  1. 将 MySQL 的 JDBC 驱动拷贝到 Hive 的 lib 目录下:
    随便在网上下载一个mysql的驱动包
cp /opt/software/mysql-connector-java-5.1.48.jar /opt/module/hive/lib/
  1. 配置Metastore 到MySQL
    在$HIVE_HOME/conf 目录下新建 hive-site.xml 文件
[root@hadoop102 conf]$ vim hive-site.xml

添加如下内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</val ue>
</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>000000</value>
</property>

<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>

<property>

<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configurat

3.2.3 启动Hive

  1. 新建 Hive 元数据库
    在这里插入图片描述
  2. 初始化hive元数据库(在hive目录下)
schematool -initSchema -dbType mysql -verbose

3.2.4 启动hive 客户端

  1. 启动 Hive 客户端
[root@hadoop102 hive]$ bin/hive
  1. 查看一下数据库
hive (default)> show databases; OK
database_name
default

3.3 Hive on Spark 配置

3.3.1 兼容性说明

**注意:**官网下载的 Hive3.1.2 和 Spark3.0.0 默认是不兼容的。因为 Hive3.1.2 支持的 Spark
版本是 2.4.5,所以需要我们重新编译 Hive3.1.2 版本。
编译步骤:官网下载 Hive3.1.2 源码,修改 pom 文件中引用的 Spark 版本为 3.0.0,如果编译通过,直接打包获取 jar 包。如果报错,就根据提示,修改相关方法,直到不报错,打包获取 jar 包。

3.3.2 在 Hive 所在节点部署 Spark

如果之前已经部署了 Spark,则该步骤可以跳过,但要检查 SPARK_HOME 的环境变量配置是否正确。

  1. Spark 官网下载 jar 包地址:
    http://spark.apache.org/downloads.html

  2. 上传并解压 spark-3.0.0-bin-hadoop3.2.tgz
    在这里插入图片描述

[root@hadoop102 spark]# ls
bin  conf  data  examples  jars  kubernetes  LICENSE  licenses  NOTICE  python  R  README.md  RELEASE  sbin  yarn
[root@hadoop102 spark]# pwd
/opt/module/spark
[root@hadoop102 spark]# 
  1. 配置 SPARK_HOME 环境变量
[root@hadoop102 software]$ vim /etc/profile.d/my_env.sh

添加内容:

# SPARK_HOME
export SPARK_HOME=/opt/module/spark
export PATH=$PATH:$SPARK_HOME/bin

source 使其生效

  1. 新建 spark 配置文件
vim /opt/module/hive/conf/spark-defaults.conf

添加以下内容:

spark.master 					 yarn
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://hadoop102:8020/spark-history
spark.executor.memory			1g	
spark.driver.memory  			1g	
  1. 在 HDFS 创建如下路径,用于存储历史日志
hadoop fs -mkdir /spark-history

3.3.3 向 HDFS 上传 Spark 纯净版 jar 包

说明 1:由于 Spark3.0.0 非纯净版默认支持的是 hive2.3.7 版本,直接使用会和安装的Hive3.1.2 出现兼容性问题。所以采用 Spark 纯净版 jar 包,不包含 hadoop 和 hive 相关依赖,避免冲突。

说明 2:Hive 任务最终由 Spark 来执行,Spark 任务资源分配由 Yarn 来调度,该任务有可能被分配到集群的任何一个节点。所以需要将 Spark 的依赖上传到 HDFS 集群路径,这样集群中任何一个节点都能获取到。

(1)上传并解压 spark-3.0.0-bin-without-hadoop.tgz
在这里插入图片描述

tar -zxvf /opt/software/spark-3.0.0-bin-without-hadoop.tgz

(2)上传 Spark 纯净版 jar 包到 HDFS

hadoop fs -mkdir /spark-jars
hadoop fs -put spark-3.0.0-bin-without-hadoop/jars/* /spark-jars

3.3.4 修改 hive-site.xml 文件

vim /opt/module/hive/conf/hive-site.xml

添加以下内容:

<!--Spark 依赖位置(注意:端口号 8020 必须和 namenode 的端口号一致)-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://hadoop102:8020/spark-jars/*</value>
</property>

<!--Hive 执行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>

<!--Hive 和Spark 连接超时时间-->
<property>
<name>hive.spark.client.server.connect.timeout</name>
<value>10000ms</value>
</property>

**注意:**hive.spark.client.connect.timeout 的默认值是 1000ms,如果执行 hive 的 insert 语句时,抛如下异常,可以调大该参数到 10000ms

3.4 Hive on Spark 测试

(1)启动 hive 客户端

[root@hadoop102 hive]$ bin/hive	

(2)创建一张测试表

hive (default)> create table student(id int, name string);	

(3)通过 insert 测试效果

hive (default)> insert into table student values(1,'abc');

3.5 Yarn 容量调度器并发度问题演示

Yarn 默认调度器为 Capacity Scheduler(容量调度器),且默认只有一个队列——default。如果队列中执行第一个任务资源不够,就不会再执行第二个任务,一直等到第一个任务执行完毕。

  1. 启动 1 个 hive 客户端,执行以下插入数据的 sql 语句。
 hive (default)> insert into table student values(1,'abc');

执行该语句,hive 会初始化一个 Spark Session,用以执行 hive on spark 任务。由于未指
定队列,故该 Spark Session 默认占用使用的就是 default 队列,且会一直占用该队列,直到退出 hive 客户端。
可访问 ResourceManager 的 web 页面查看相关信息。
在这里插入图片描述

  1. 在 hive 客户端开启的状态下,提交一个 MR。
[atguigu@hadoop102 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

MR 任务同样未指定队列,所以其默认也提交到了 default 队列,由于容量调度器单个
队列的并行度为 1。故后提交的 MR 任务会一直等待,不能开始执行。

  1. 容量调度器 default 队列中,同一时间只有一个任务执行,并发度低,如何解决呢?
  • 方案一:增加 ApplicationMaster 资源比例,进而提高运行 app 数量。
  • 方案二:创建多队列,比如增加一个 hive 队列。

3.6 增加ApplicationMaster 资源比例

针 对 容 量 调 度 器 并 发 度 低 的 问 题 , 考 虑 调 整 yarn.scheduler.capacity.maximum-am-resource-percent 该参数。默认值是 0.1,表示集群上 AM最多可使用的资源比例,目的为限制过多的 app 数量。

  1. 在 hadoop102 的/opt/module/hadoop-3.1.3/etc/Hadoop/capacity-scheduler.xml 文件中修改如下参数值:
vim capacity-scheduler.xml
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.5</value>
<description>
集群中用于运行应用程序 ApplicationMaster 的资源比例上限,该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,
默认是 0.1,表示 10%。所有队列的 ApplicationMaster 资源比例上限可通过参数 yarn.scheduler.capacity.maximum-am-resource-percent 设置,而单个队列可通过参数
yarn.scheduler.capacity.<queue-path>.maximum-am-resource-perce
nt 设置适合自己的值。
</description>
</property
  1. 分发 capacity-scheduler.xml 配置文件
[root@hadoop102 hadoop]$ xsync capacity-scheduler.xml
  1. 关闭正在运行的任务,重新启动 yarn 集群

3.7 增加 Yarn 容量调度器队列

方案二:创建多队列,也可以增加容量调度器的并发度。在企业里面如何配置多队列:
按照计算引擎创建队列 hive、spark、flink
按照业务创建队列:下单、支付、点赞、评论、收藏(用户、活动、优惠相关)有什么好处?
假如公司来了一个菜鸟,写了一个递归死循环,公司集群资源耗尽,大数据全部瘫痪。解耦。
假如 11.11 数据量非常大,任务非常多,如果所有任务都参与运行,一定执行不完,怎么办?

可以支持降级运行。
下单 √
支付√
点赞 X

  1. 增加容量调度器队列
    默认 Yarn 的配置下,容量调度器只有一条 default 队列。在 capacity-scheduler.xml 中可以配置多条队列,修改以下属性,增加 hive 队列。
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
<description>
再增加一个 hive 队列
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
<description>
default 队列的容量为 50%
</description>
</property>

同时为新加队列添加必要属性:

<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>50</value>
<description>
hive 队列的容量为 50%
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
<description>
一个用户最多能够获取该队列资源容量的比例,取值 0-1
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
<description>
hive 队列的最大容量(自己队列资源不够,可以使用其他队列资源上限)
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
<description>
开启 hive 队列运行,不设置队列不能使用
</description>
</property>

<property>

<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
<description>
访问控制,控制谁可以将任务提交到该队列,*表示任何人
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
<description>
访问控制,控制谁可以管理(包括提交和取消)该队列的任务,*表示任何人
</description>
</property>

<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
<description>
指定哪个用户可以提交配置任务优先级
</description>
</property>
<property>

<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</nam  e>
<value>-1</value>
<description>
hive 队列中任务的最大生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
</description>
</property>
<property>

<name>yarn.scheduler.capacity.root.hive.default-application-lifetime</nam  e>
<value>-1</value>
<description>
hive 队列中任务的默认生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
</description>
</property>
  1. 集群分发脚本
xsync /opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml
  1. 重启 Hadoop 集群

3.8 创建数据库

  1. 启动hive
[root@hadoop102 hive]$ bin/hive
  1. 显示数据库
hive (default)> show databases;
  1. 创建数据库
hive (default)> create database gmall;
  1. 使用数据库
hive (default)> use gmall;

3.9 idea连接

在这里插入图片描述

四、数据导出

4.1 数仓五层描述

  • 大数据-数仓分层之ODS
  • 大数据-数仓分层之DWD
  • 大数据-数仓分层之DWS
  • 大数据-数仓分层之DWT
  • 大数据-数仓分层之ADS

4.2 创建MySQL 数据库和表

  1. 创建数据库
    在这里插入图片描述
    这里只对用户主题和地区主题进行分析
  2. 创建用户主题表
    (1)创建用户主题表
DROP TABLE IF EXISTS `ads_user_topic`; CREATE TABLE `ads_user_topic` (
`dt` date NOT NULL,
`day_users` bigint(255) NULL DEFAULT NULL,
`day_new_users` bigint(255) NULL DEFAULT NULL,
`day_new_payment_users` bigint(255) NULL DEFAULT NULL,
`payment_users` bigint(255) NULL DEFAULT NULL,
`users` bigint(255) NULL DEFAULT NULL,
`day_users2users` double(255, 2) NULL DEFAULT NULL,
`payment_users2users` double(255, 2) NULL DEFAULT NULL,
`day_new_users2users` double(255, 2) NULL DEFAULT NULL, PRIMARY KEY (`dt`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT
= Compact;

(2)创建地区主题表

DROP TABLE IF EXISTS `ads_area_topic`; CREATE TABLE `ads_area_topic` (
`dt` date NOT NULL,
`id` int(11) NULL DEFAULT NULL,
`province_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`area_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`iso_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`region_id` int(11) NULL DEFAULT NULL,
`region_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`login_day_count` bigint(255) NULL DEFAULT NULL,
`order_day_count` bigint(255) NULL DEFAULT NULL,
`order_day_amount` double(255, 2) NULL DEFAULT NULL,
`payment_day_count` bigint(255) NULL DEFAULT NULL,
`payment_day_amount` double(255, 2) NULL DEFAULT NULL, PRIMARY KEY (`dt`, `iso_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT
= Compact;
  1. 其余 ads 层表(略)

4.3 Sqoop 导出脚本

在/home/atguigu/bin 目录下创建脚本 hdfs_to_mysql.sh
上传的那个包里有脚本

这里讲下里面的参数:

#!/bin/bash

hive_db_name=gmall mysql_db_name=gmall_report

export_data() {
    
    
/opt/module/sqoop/bin/sqoop export \
-Dmapreduce.job.queuename=hive \
--connect "jdbc:mysql://hadoop102:3306/${mysql_db_name}?useUnicode=true&characterEn coding=utf-8" \
--username root \
--password 000000 \
--table $1 \
--num-mappers 1 \
--export-dir /warehouse/$hive_db_name/ads/$1 \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key $2 \
--input-null-string '\\N'	\
--input-null-non-string '\\N'
}

case $1 in
"ads_uv_count")
export_data "ads_uv_count" "dt"
;;
"ads_user_action_convert_day")
export_data "ads_user_action_convert_day" "dt"
;;
"ads_user_topic")
export_data "ads_user_topic" "dt"
;;
"ads_area_topic")
export_data "ads_area_topic" "dt,iso_code"
;;
"all")
export_data "ads_user_topic" "dt" 
export_data "ads_area_topic" "dt,iso_code"
#其余表省略未写
;;
esac

关于导出 update 还是 insert 的问题

  • –update-mode:
    updateonly 只更新,无法插入新数据
    allowinsert 允许新增
  • –update-key:允许更新的情况下,指定哪些字段匹配视为同一条数据,进行更新而不增加。多个字段用逗号分隔。
  • –input-null-string 和–input-null-non-string:
    分别表示,将字符串列和非字符串列的空串和“null”转义

Hive 中的 Null 在底层是以“\N”来存储,而 MySQL 中的 Null 在底层就是 Null,为了保证数据两端的一致性。在导出数据时采用–input-null-string 和–input-null-non-string 两个参数。导入数据时采用–null-string 和–null-non-string。

然后导入到数据库里面的就是最后需要展示的数据;

总结

整个流程就是
原始数据 --> hdfs --> ods --> dwd --> dws --> dwt --> ads --> mysql


感谢大家阅、互相学习;
感谢尚硅谷提供的学习资料;
有问题评论或者发邮箱;
gitee:很多代码仓库;
[email protected]

猜你喜欢

转载自blog.csdn.net/weixin_44704261/article/details/111939382