数仓之新零售项目

新零售项目

1.新零售概述

1.1行业背景

早起基本上都是一些线下店铺:
阶段一:百货商店
阶段二:超级市场
阶段三:连锁商店
阶段四:电子商务(网络销售--网店)
阶段五:新零售(线上+线下+物流)

1.2业务模块介绍

1.商品发布流程
在这里插入图片描述
2.单店铺订单流程
在这里插入图片描述
3.购物车流程
在这里插入图片描述
4.配送流程图
在这里插入图片描述
5.退货业务流程图
在这里插入图片描述
6.项目架构图
在这里插入图片描述

  1. 基于cloudera manager构建的大数据分析平台, 在此平台基础上, 构建有 HDFS, YARN, zookeeper,
    sqoop, oozie, HUE, HIVE 等相关的大数据组件, 同时为了提升分析的效率. 引入presto来进行分析处理操作,
    使用FineBi实现图表展示操作, 整个分析工作是一个周而复始, 不断的干, 采用oozie完成任务的调度工作
  2. 数据流转的流程: 整个项目的数据源都是集中在MySQL中的, 通过sqoop完成数据的导入操作, 将数据导入到HDFS中,
    使用HIVE构建相关的表, 建立数仓体系, 在HIVE进行分层处理, 在进行统计分析的时候, 采用presto提升分析的效率,
    将分析的结果导出到Mysql中, 最后使用fineBi完成报表展示操作, 整个项目基于cloudera manager进行监控管理,
    使用oozie完成工作流的调度操作

1.3clouderamanager工具介绍

  1. cloudera manager 是一款大数据的统一监控管理平台, 此平台主要是对cloudera公司旗下CDH版本软件进行管理工作,
  2. 提供的服务: 统一的监控, 自动化部署, 对CDH软件进行相关管理. 产生原因: apache版本软件所存在弊端:
    部署过程极其复杂,超过20个节点的时候,手动部署已经超级累 各个组件部署完成后,各个为政,没有统一化管理界面
    组件和组件之间的依赖关系很复杂,一环扣一环,部署过程心累
    各个组件之间没有统一的metric可视化界面,比如说hdfs总共占用的磁盘空间、IO、运行状况等
    优化等需要用户自己根据业务场景进行调整(需要手工的对每个节点添加更改配置,效率极低,我们希望的是一个配置能够自动的分发到所有的节点上)
    市场需要有一款统一软件, 对大数据中各个组件进行统一化管理操作, 由此产生cloudera manager 另一个原因:
    cloudera 公司希望能够有更多客户使用CDH版本, 降低客户使用难度

1.4项目环境部署操作

  1. 将资料中提供虚拟机压缩包, 解压到一个没有中文没有空格, 以及磁盘空间相对充足的磁盘中(大于100GB)
    在这里插入图片描述
  2. 修改VMware的网卡设置: 统一修改为 88网段, 网关为192.168.88.2
    在这里插入图片描述
    在这里插入图片描述
  3. 在windows的hosts文件中, 添加映射信息: C:\Windows\System32\drivers\etc
    添加以下内容:
    192.168.88.80 hadoop01 hadoop01.itcast.cn
    192.168.88.81 hadoop02 hadoop02.itcast.cn
    4)连接cloudera manager
    http://hadoop01:7180
    用户名: admin
    密码: admin
    注意: 后续关闭虚拟机: 务必使用shutdown -h now | init 0 万万不可直接强制关机
    重启虚拟机: 使用reboot命令
    长时间不使用虚拟机, 建议将其关机(尤其是使用机械硬盘的) 比如中午的时候
    启动服务器后, 并不能立即访问, 需要等待大约 5~15分钟的时候后, 才可以正常访问 7180

1.5数据仓库的基本概念

1- 什么是数据仓库呢?
存储数据的仓库, 主要用于存储过去历史发生过的数据,面向主题, 对数据进行统计分析的操作, 从而能够对未来提供决策支持
2- 数据仓库最大的特点是什么呢?
数据仓库既不生产数据, 也不消耗数据, 数据来源于各个数据源
3- 数据仓库的四大特征:

  • 1- 面向主题: 分析什么 什么就是我们的主题
  • 2- 集成性: 数据从各个数据源汇聚而来, 数据的结构都不一定一样
  • 3- 非易失性(稳定性): 存储都是过去历史的数据, 不会发送变更, 甚至某些数据仓库都不支持修改操作
  • 4- 时变性: 随着时间推移, 将最近发生的数据也需要放置到数据仓库中, 同时分析的方案也无法满足当前需求, 需要变更分析的手段

4- OLAP 和 OLTP区别:
在这里插入图片描述

5- 什么是ETL:

  • ETL: 抽取 转换 加载
  • 狭义上ETL: 指的数据从ODS层抽取出来, 对ODS层的数据进行清洗转换处理的操作, 将清洗转换后的数据加载到DW层过程
  • 宽泛的ETL: 指的是数仓的全过程

6- 什么是数据仓库 和 数据集市

  • 数据仓库是包含数据集市的, 在一个数据仓库中可以有多个数据集市
  • 数据仓库: 一般指的构建集团数据中心, 基于业务形成各种业务的宽表或者统计宽表
  • 数据集市: 基于部门或者基于主题, 形成主题或者部门相关的统计宽表

2.维度分析

2.1维度分析的基本介绍

1.什么是维度?

  • 看待问题角度, 当我们对一个主题进行分析的时候, 可以从不同的角度来分析, 这些角度就是维度 比如说: 对订单进行分析 可以从 用户,
    时间, 地区, 商家, 商圈…

维度的分类:

  • 定性维度: 一般指的统计 每个 各个 这种维度, 比如 统计每天 每小时 各个用户… 这种维度在编写SQL, 一般是放置在
    group by

  • 定量维度: 一般指的统计某个范围, 或者某个具体值的, 比如 统计年龄在18~60岁, 时间为2021年度,这种维度在编写 SQL, 一般是放置在 where条件

  • 上卷 和 下钻: 比如说 我们以天作为标准, 上卷统计 周 月 年 下钻统计: 小时

  • 分层或者分级: 比如说: 以地区为例, 将地区划分为 省份 市 县/区

2.什么是指标

  • 衡量事务发展的标准,也叫度量, 简单来说: 在根据维度进行分析的时候, 必然要分析出一些结果, 这个结果就是度量

常见的度量值有那些:

  • count(), sum(), min(),max(),avg()

指标的分类:

  • 绝对指标: 指的统计计算一个具体的值, 比如说 销售额, 订单量
  • 必须要对全部的数据进行统计处理
  • count(), sum(), min(),max(),avg()
  • 相对指标: 指的统计相对的结果, 比如说 同比增长 环比增长 流失率 增长率…
  • 这些指标在计算的时候, 是可以不需要对全部数据进行统计,可以通过抽样的方式来计算即可

例子:
需求:

  • 请统计在2021年度, 来自于北京 女性 未婚, 年龄在 18 ~28 之间的每天的销售总额是多少? 分析:
    涉及到维度: 时间维度, 地区维度, 性别, 婚姻状态, 年龄
    定性维度: 每天
    定量维度: 2021, 北京 女性 未婚 年龄
    涉及指标: 销售额(绝对指标)
    sum()
    SQL:
    select day, sum(price) from where 时间 = 2021 and address = ‘北京’ and sex = ‘女性’ and status = ‘未婚’ and age between 18 and 28 group by day;

3.数仓建模

3.1数仓建模概念

如何在数据仓库中构建表, 是一套用于规范化建表的理论

3.2常见的数仓建模理论

  • 三范式建模: 主要是应用在传统的数据仓库中, 指的数据存储在关系型的数据库中, 要求在建表的时候, 表必须有主键
    同时表中尽量的避免数据的冗余的发生, 尽可能拆分表
  • 维度建模: 主要是应用于新型的数据仓库中, 指的数据存储在专门用于进行OLAP数据库中, 比如 要求建模的时候以分析为前提,
    只要是利于分析的建模方案, 认为都是OK的, 在此情况下, 即使数据存在一定的冗余也是OK的
    在这里插入图片描述
    后续主要采用维度建模的思想来构建相关的表, 在维度建模中, 主要规定了两种表模型: 事实表 和 维度表

3.3事实表

事实表: 指的主题,要统计的主题是什么, 对应事实就是什么, 而主题所对应的表, 其实事实表

  • 事实表一般是一坨主键(其他表)的聚集
  • 事实表一般是反应了用户某种行为表

比如说:

  • 订单表, 收藏表, 登录表, 购物车表 …
    事实表分类:
  • 事务事实表 : 最初始确定的事实表 其实就是事务事实表
  • 累计快照事实表: 指的对数据进行提前聚合后表, 比如将事实表按照天聚合统计 结果表
  • 周期快照事实表: 每一条数据, 记录了完整的事件 从开始 到结束整个流程, 一般有多个时间组成

3.4维度表

维度表: 当对事实表进行统计分析的时候, 可能需要关联一些其他表进行辅助, 这些表其实就是维度表

  • 维度表一般是由平台或者商家来构建的表, 与用户无关, 不会反应用户的行为
  • 比如说: 地区表 商品表 时间表, 分类表…

维度表分类:
高基数维度表: 如果数据量达到几万 或者几十万 甚至几百万的数据量, 一般这样维度表称为高基数维度表

  • 比如: 商品表 , 用户表

低基数维度表: 如果数据量只有几条 或者 几十条 或者几千条, 这样称为低基数维度表

  • 比如: 地区表 时间表 分类表 配置表

3.5数仓发展模型

数仓发展模型的三种模型
星型模型:

  • 特点: 只有一个事实表, 也就意味着只有一个分析的主题, 在事实表周围围绕了多张维度表, 维度表与维度表没有任何关联
  • 数仓发展阶段: 初期

雪花模型:

  • 特点: 只有一个事实表, 也就意味着只有一个分析的主题, 在事实表周围围绕了多张维度表, 维度表可以接着关联其他的维度表
  • 数仓发展阶段: 异常, 出现畸形状态 在实际数仓中, 这种模型建议越少越好, 尽量避免这种模型产生

星座模型:

  • 特点: 有多个事实表, 也就意味着有了多个分析的主题, 在事实表周围围绕了多张维度表, 在条件吻合的情况下, 事实表之间是可以共享维度表
  • 数仓发展阶段: 中期 和 后期

3.6缓慢渐变维

主要是用于解决历史变更问题, 处理历史变更的数据是否需要保留的问题
如何解决问题?

  • SCD1: 不维护历史变更行为, 直接对过去数据进行覆盖即可(此种操作 仅适用于错误数据的处理)
  • SCD2: 维护历史变更行为, 处理方式 在表中新增两个新的字段, 一个是起始时间, 一个是结束时间, 当数据发生变更后,将之前的数据设置为过期, 将新的变更后完整的数据添加到表中, 重新记录其起始和结束时间, 将这种方案称为 **拉链表(好处: 可以维护更多的历史版本的数据, 处理起来也是比较简单的 (利于维护)),(弊端: 造成数据冗余存储 大量占用磁盘空间)
  • SCD3: 维度历史变化, 处理方式, 当表中有字段发生变更后, 新增一列, 将变更后的数据存储到这一列中即可(好处:
    减少数据冗余存储),(弊端: 只能维护少量的历史版本, 而且维护不方便, 效率比较低),(适用于:
    空间比较紧缺,而且只需要维护少量版本的情况)

3.7数仓分层介绍

ODS: 源数据层(临时存储层)

  • 作用: 对接数据源, 用于将数据源的数据完整的导入到ODS层中, 一般ODS层的数据和数据源的数据保持一致, 类似于一种数据迁移的操作,
    一般在ODS层建表的时候, 会额外增加一个 日期的分区, 用于标记何时进行数据采集

DW: 数据仓库层

  • 作用: 用于进行数据统计分析的操作, 数据来源于 ODS层

APP(DA|ADS | RPT |ST) : 数据应用层(数据展示层)

  • 作用: 存储分析的结果信息, 用于对接相关的应用, 比如 BI图表

以新零售项目为例:

ODS层: 源数据层(临时存储层) 作用: 对接数据源, 用于将数据源的数据完整的导入到ODS层中,一般ODS层的数据和数据源的数据保持一致, 类似于一种数据迁移的操作, 一般在ODS层建表的时候, 会额外增加一个 日期的分区,       用于标记何时进行数据采集
DW层:  数据仓库层
		DWD层: 明细层
			作用: 和ODS层保持相同的粒度,不会对数据进行聚合操作, 只要进行清洗 转换工作, 保证数据质量,利于后续分析
			清洗: 过滤掉一些无用数据
			转换: 格式转换 或者  一个字段 转换为多个字段,  json转换....
		DWB层: 基础数据层
			作用: 进行维度退化的操作, 根据业务模块. 形成业务宽表
			维度退化: 
				以订单表为例, 在订单表中, 有用户 id , 商品id 商家id, 地区的id信息. 如果统计需要按照用户, 商品, 商家 和地区来统计操作, 此时需要关联用户表, 商品表 商家表 地区表
				维度退化:
					提前先将这些维度表中可能需要使用字段合并到事实表中, 让事实表变的更宽,后续在统计的时候, 只需要关联订单表即可
		DWS层: 业务数据层
			作用: 用于进行提前聚合操作, 形成基础主题统计宽表指标数据
			例如: 需求要求统计 每年 每月 每日的销售额. 那么在DWS层, 可以先按照日形成统计结果数据
	DM层: 数据集市层
		作用: 基于主题, 形成数据集市, 对指标进行细化统计过程
		例如: 需要将 每年 每月 每日的销售额全部记录在DM层中, 此时我们只需要对DWS层进行上卷统计即可
	APP(DA|ADS | RPT |ST) :  数据应用层(数据展示层)
		作用: 存储分析的结果信息, 用于对接相关的应用, 比如  BI图表

4.数仓工具的基本使用

4.1使用 HUE 操作 oozie

oozie:是一个工作流读调度工具,实现对工作流的定时调度操作
工作流:指业务过程的部分或整体在计算机应用环境下的自动化
工作流一般要满足以下几个特征:

1- 一个流程是可以被拆解为多个阶段(步骤)
2- 多个阶段之间存在依赖关系, 前序没有执行, 后续无法执行
3- 整个流程 需要周而复始不断的干

请问, 大数据的工作流程是否可以使用工作流解决呢?
先回答: 大数据的工作流程有那些呢?

1- 确定数据源
2- 数据的存储
3- 数据的预处理
4- 数据的分析处理
5- 数据的应用
所以说大数据可以使用工作流解决问题的

能够实现工作流的大数据组件有那些?

	oozie: 
		是apache旗下一款工作流的调度工具, 出现时间也是比较久的, oozie如果单独使用, 是非常麻烦的, 提供的管理界面仅仅只能查看一些状态, 无法对工作流进行操作, 所有的操作都需要通过配置 XML文档, 整个配置非常复杂的
		但是由于人家apache 大数据 全家桶一员, HUE在集成一款调度工具, 优先选择自家产品, 使用HUE, 只需要用户通过鼠标点一点即可完成oozie工作流的配置了
	azkaban:
		属于领英公司旗下一款的工作流的调度工具, 开源免费的,  azkaban简单来说就是一个shell脚本调度工具, 提供了同一个工作流的界面,可以直接在界面上提交工作流 ,并对工作流进行监控, 整个工作流的配置, 仅需要简单配置几行类似于properties文件即可完成
		单独使用角度: azkaban
		如果结合HUE:  oozie

4.2如何使用oozie

1.开启hue对oozie的支持
在这里插入图片描述

  • 2- 重启 HUE , 实现配置生效
    在这里插入图片描述
    3.查看hue界面
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    查看输出结果:
    在这里插入图片描述
    4.如何配置定时:
    在这里插入图片描述
    在这里插入图片描述

4.3sqoop的基本使用操作

4.3.1sqoop的概述

1.sqoop是apache旗下顶级项目. 主要是用于 RDBMS 和 大数据生态圈之间的数据导入导出的工具, 从RDBMS 到大数据生态圈 是导入操作, 反之为导出操作
在这里插入图片描述
sqoop本质上也是一款翻译软件, 将sqoop的命令翻译为 MR程序
关于使用sqoop 将数据导入到HIVE, 支持两种导入方案: 原生导入方案 和 hcatalog方式

区别点:  
	如果使用原生导入方式, 导入HIVE , 仅支持 textFile导入方式
	hcatalog支持数据存储方案比较多: textFile, ORC, sequence, parquet....
	原生方式支持数据覆盖导入
	hcatalog仅支持追加导入
	原生方式在导入时候, 根据字段的顺序, 导入到HIVE中
	hcatalog在导入的时候, 是根据字段的名称导入的    
	(此部分建议在导入到HIVE , hive表字段的顺序 和 mysql表字段顺序保持一致, 名称保持一致)
后续主要采用 hcatalog的导入方式, 因为建表的时候, 主要存储格式为 ORC

4.3.2基本操作

(1).如何查看某个操作下的相关的参数信息:

sqoop 操作 --help

在这里插入图片描述
(2)查询mysql中所有的库有那些?

思考: 连接mysql需要知道什么信息呢? 
	1- 用户名  2- 密码  3- 连接地址 
sqoop list-databases --connect jdbc:mysql://hadoop01:3306  --username root  --password 123456

(3)查询mysql中scm中所有的表

sqoop list-tables \
--connect jdbc:mysql://hadoop01:3306/scm \
--username root \
--password 123456

4.3.3数据全量导入操作

创建表:

create database test default character set utf8mb4 collate utf8mb4_unicode_ci;
use test;

create table emp
(
    id     int         not null
        primary key,
    name   varchar(32) null,
    deg    varchar(32) null,
    salary int         null,
    dept   varchar(32) null
);

INSERT INTO emp (id, name, deg, salary, dept) VALUES (1201, 'gopal', 'manager', 50000, 'TP');
INSERT INTO emp (id, name, deg, salary, dept) VALUES (1202, 'manisha', 'Proof reader', 50000, 'TP');
INSERT INTO emp (id, name, deg, salary, dept) VALUES (1203, 'khalil', 'php dev', 30000, 'AC');
INSERT INTO emp (id, name, deg, salary, dept) VALUES (1204, 'prasanth', 'php dev', 30000, 'AC');
INSERT INTO emp (id, name, deg, salary, dept) VALUES (1205, 'kranthi', 'admin', 20000, 'TP');

create table emp_add
(
    id     int         not null
        primary key,
    hno    varchar(32) null,
    street varchar(32) null,
    city   varchar(32) null
);

INSERT INTO emp_add (id, hno, street, city) VALUES (1201, '288A', 'vgiri', 'jublee');
INSERT INTO emp_add (id, hno, street, city) VALUES (1202, '108I', 'aoc', 'sec-bad');
INSERT INTO emp_add (id, hno, street, city) VALUES (1203, '144Z', 'pgutta', 'hyd');
INSERT INTO emp_add (id, hno, street, city) VALUES (1204, '78B', 'old city', 'sec-bad');
INSERT INTO emp_add (id, hno, street, city) VALUES (1205, '720X', 'hitec', 'sec-bad');

create table emp_conn
(
    id    int         not null
        primary key,
    phno  varchar(32) null,
    email varchar(32) null
);

INSERT INTO emp_conn (id, phno, email) VALUES (1201, '2356742', '[email protected]');
INSERT INTO emp_conn (id, phno, email) VALUES (1202, '1661663', '[email protected]');
INSERT INTO emp_conn (id, phno, email) VALUES (1203, '8887776', '[email protected]');
INSERT INTO emp_conn (id, phno, email) VALUES (1204, '9988774', '[email protected]');
INSERT INTO emp_conn (id, phno, email) VALUES (1205, '1231231', '[email protected]');

如何全量将数据导入到HDFS中:
需求一: 将 emp表中数据导入到HDFS中

需要知道什么信息?  数据库的基本信息(连接地址, 用户名, 密码, 表名)  目的地的路径信息
方式一:  
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp
说明: 
	1- 当不指定导出路径的时候, 默认会将数据导入到当前操作用户的HDFS的家目录下, 再次目录下以表名创建一个文件夹, 将数据放置到这个文件夹中
	2- 发现在导入数据的时候, 有多少条数据, 就会运行多少个mapTask, 最高和cpu核数相等
	3- 数据之间的分隔符号为 逗号
	
思考: 是否可以将其导入到其他位置呢? --target-dir  和  --delete-target-dir 
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp \
--delete-target-dir \
--target-dir /sqoop_works/emp
说明:
	--target-dir : 将数据导入到HDFS的那个位置中
	--delete-target-dir: 如果目的地路径以存在, 先删除

思考: 是否可以设置其mapTask的数量呢?  -m  和 --split-by
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp \
--delete-target-dir \
--target-dir /sqoop_works/emp \
-m 2 \
--split-by id
说明:
	如果  -m为1 , 表示只允许一个mapTask, 此时可能省略 --split-by 
	--split-by  表示按照那个字段进行切割数据表, 一般设置为主键字段, 如果主键字段是多个, 那么就写多个, 用逗号隔开
思考: 是否可以调整分隔符号呢? 比如说 设置为 |  参数: --fields-terminated-by 
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp \
--delete-target-dir \
--target-dir /sqoop_works/emp \
--fields-terminated-by  '|' \
-m 1

如何全量导入数据到HIVE中
需求:将emp_add这个表的全部数据导入到HIVE的对一个表中

# 1- 在HIVE中创建目标表
create database if not exists day03_xls;

create table if not exists day03_xls.emp_add(
    id int,
    hno string,
    street string,
    city string
)
row format delimited fields terminated by '\t' stored as orc;

# 2- 编写 sqoop命令 完成数据导入操作
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp_add \
--fields-terminated-by  '\t' \
--hcatalog-database 'day03_xls' \
--hcatalog-table 'emp_add' \
-m 1
注意:
	由于 hive表的存储格式为 orc, 所以无法使用sqoop的原生导入方案, 必须使用hcatalog

4.3.4数据条件导入数据

方式一: 通过 where条件的方式, 将部分数据导入到HDFS中

# 1- 以 emp为例, 在这个表中, 新增一条数据, 尝试将这一条数据导入到HDFS中
INSERT INTO  test.emp VALUES(1206,'zhangsan','bigdata dev','30000','TP');


# 2- 通过 sqoop实现数据条件导入
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp \
--where 'id > 1205' \
--delete-target-dir \
--target-dir /sqoop_works/emp_1 \
--fields-terminated-by  '|' \
-m 1

方式二: 通过 SQL的方式, 将部分数据导入到HDFS中:

# 1- 以 emp为例, 在这个表中, 新增一条数据, 尝试将这一条数据导入到HDFS中
INSERT INTO  test.emp VALUES(1207,'lisi','bigdata dev','50000','TP');

# 2- 使用sqoop条件导入数据: 采用 SQL形式
sqoop import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--query 'select * from emp where id > 1206 and $CONDITIONS' \
--delete-target-dir \
--target-dir /sqoop_works/emp_2 \
--fields-terminated-by  '|' \
-m 1

注意: 
	1- 当使用 --query 方式的时候, 不允许在使用 --table, 因为 SQL中已经明确需要导入那个表的数据
	2- 当使用 --query 方式的时候, 编写的SQL语句必须添加where条件, 条件最后必须要跟 $CONDITIONS, 如果使用双引号包裹SQL, $前面必须加一个 \ 进行转义操作, 当如果没有条件的时候,建议写成: where 1=1 and $CONDITIONS

4.3.5数据全量导出操作

需求: 将HIVE中 emp_add表中所有的数据全量导出MySQL中

步骤一:  在MySQL中创建目标表
CREATE TABLE test.emp_add_mysql (
	id INT,
	hno VARCHAR(20),
	street VARCHAR(20),
	city VARCHAR(20)
);

步骤二: 执行sqoop导出操作

sqoop export \
--connect jdbc:mysql://hadoop01:3306/test \
--username root \
--password 123456 \
--table emp_add_mysql \
--fields-terminated-by  '\t' \
--hcatalog-database 'day03_xls' \
--hcatalog-table 'emp_add' \
-m 1


注意:
	在执行数据导出的时候, 必须先创建目标表, 然后才能触发执行导出

4.3.6安装DBeaver

在这里插入图片描述
2.设置环境变量
3.连接mysql
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.导入业务端数据
在这里插入图片描述
5或者使用命令导入
source sqo脚本

5.hive的基础优化

5.1HDFS的副本数量的调整

一般HDFS的副本数量设置为3, 如果数据不是特别重要建议设置为2
​ 注意: 在HDFS的3.0版本后, 起始可以调整为1.5 (1个副本 + 纠删码(占用副本50%大小))
在这里插入图片描述

5.2nodemanager的相关基础配置

CPU配置操作:

  • 配置项:yarn.nodemanager.resource.cpu-vcores (直接在CM上修改YARN配置即可)

  • 默认值为: 8 yarn不会自动检测服务器的CPU核心数, 一般都需要手动调整

  • 推荐配置: 对应服务器是多少核 就配置多少核

     查看服务器CPU的核心数: 
     方式一: 命令行方式
     	grep 'processor' /proc/cpuinfo | sort -u | wc -l
     方式二: 直接通过CM查询
    

如何配置:直接在CM上进行调整即可
在这里插入图片描述
内存配置
配置项

  • yarn.nodemanager.resource.memory-mb (直接在CM上进行配置即可)

  • yarn.scheduler.maximum-allocation-mb :调度器内存配置, 和第一个保持一致

  • yarn.app.mapreduce.am.command-opts : 略小于第一个配置内存大小

  • 默认值: 8GB yarn不会自动检测服务器的内存值, 一般都需要手动调整

  • 推荐配置: 剩余内存 * 0.8 左右

  • 如何配置: 直接在CM上配置即可
    在这里插入图片描述
    本地目录的配置

  • 配置项:yarn.nodemanager.local-dirs(Yarn)

  • 说明: 在执行MR过程中, nodemanager产生临时文件存储在那些目录中

  • 推荐配置: 服务器挂载了几个磁盘, 就配置几个目录 一个目录对应其中一个磁盘位置

     磁盘挂载目录的查询命令:
     	df -lh
    

5.3MapReduce的内存配置

相关的内存配置内容(一般不配置,正常使用即可,如果发现执行效率非常慢,可以尝试调整内存配置)

mapreduce.map.memory.mb:  用于配置map的内存大小
mapreduce.reduce.memory.mb: 用于配置reduce的内存大小
mapreduce.map.java.opts : 用于配置map的jvm的内存大小
mapreduce.reduce.java.opts: 用于配置reduce的jvm的内存大小
说明:  
	1. 对应jvm的内存配置要略小于 map或者reduce的内存大小配置
	2. map和reduce的内存配置大小, 不能超过nodemanager的内存大小

5.4hive的基础配置

1.hiveserver2的java堆栈的内存配置
配置项:hiveserver2的堆栈大小
在这里插入图片描述
此配置后续会有一个报错,反应就是此配置过小
在这里插入图片描述
此操作在遇到问题,在进行调整,此时暂时不调整
HIve并行编译
默认情况下,hive同时只能编译一段hive sql并上锁
配置项:hive.driver.parallel.compilation
在这里插入图片描述

  • 生成动态分区的线程数量:
    • 配置项: hive.load.dynamic.partitions.thread (直接在CM上调整)
    • 默认值: 15
    • 此配置, 值越大, 执行效率越高, 但是资源损耗也会越高
  • 监听输入的线程数量:
    • 配置项: hive.exec.input.listing.max.threads
    • 默认值: 15
    • 此配置, 值越大, 读取效率越高, 但是资源损耗也会越高

5.5压缩的配置

HIVE 本质上, 将SQL翻译为MR , 所以hive压缩配置, 更多指的是对MR的压缩配置操作
关于压缩的相关的配置:

set hive.exec.compress.intermediate=true; 是否开启hive的支持中间结果压缩配置  默认关闭的
mapreduce.map.output.compress : 是否开启map端压缩配置   默认开启的
mapreduce.map.output.compress.codec: map端采用何种压缩方案
	选择为: 
		org.apache.hadoop.io.compress.SnappyCodec
set hive.exec.compress.output=true; 是否开启hive的最终结果的压缩配置  默认是关闭的]
mapreduce.output.fileoutputformat.compress: 是否开启reduce端压缩配置   默认关闭的
mapreduce.output.fileoutputformat.compress.codec : reduce端采用何种压缩方案
	选择为: 
		org.apache.hadoop.io.compress.SnappyCodec
mapreduce.output.fileoutputformat.compress.type : 配置压缩方案
	选择为: BLOCK(块压缩)
注意:
	只要不是带有 set操作的配置, 都是直接在cm上进行配置操作
	带有set的 是需要在客户端中进行配置的

5.6执行引擎选择

配置项: hive.execution.engine
在这里插入图片描述

6.ODS数据采集操作

6.1ODS数据采集概述

作用: 对接数据源, 一般和数据源保持相同的粒度
ODS层: 处于在HIVE端
业务数据: MySQL
目标: 将MySQL中业务库的表数据 导入到 ODS层中
技术: sqoop 完成导入的操作

6.2数据的存储格式和压缩方案

1.存储格式两大类:行式存储和列式存储
行式存储优点(textFIle):可读性较好,执行select效率较高。缺点:耗费磁盘资源,执行select字段,效率较低
列式存储优点(orc):节省磁盘空间,执行select字段,效率比较高。缺点:执行select效率比较低,可读性不是很好。
orc是兼具行式存储优势和列式存储优势,数据按行分块,每块中按列存储数据,同时在每个块内部,对数据构建索引,提升查询的效率.
在hive中,一般我们的选择都是orc存储格式,除非需求对接的数据源是普通文本文件数据,此时会对接此文件的表构建为textfile,其余的层次结构的表依然使用orc.
2压缩方案:
zlib(gzip):具有良好的压缩比,但是解压缩的性能一般
snappy:具有良好的解压缩的性能,同时具有较好的压缩比,弊端,没有zlib压缩比好,同时hadoop默认原生是不支持snappy压缩的(chd版本直接支持的)
本项目主要采用snappy的压缩方式:
在ods层,一般会使用zlib
在其他层次中,一般采用snappy
使用说明:
如果读取此时比较少,写入了较大,优先保证压缩比,比如说ods层,如果读取次数比较高,优先保障解压缩性能,如果不清楚,建议使用snappy,或者如果空间足够,统一采用sanppy也没有问题
3.创建表选择内部表,还是外部表
判断标准:对数据是否有管理的权限
有权限删除数据,那么我们可以构建内部表,当然也可以构建外部表,如果没有权限删除数据,只能构建外部表.
内部表转换为外部表:
alter table 表名 set tblproperties('EXTERANL'='FALSE');
通过true和false来修改是否为内部表还是外部表
一般来说,在数仓中,除了ODS层可能会出现外部表以外,其余的层次结构,大多数还是外部表.
3.创建表的时候,是否需要构建分区表呢
一般情况下,都是分区表(分区字段大多数都是以时间为主)

6.3数据同步方式

1.全量覆盖同步方式
适用于表数据变更的二频次并不多,不需要记录其历史数据,而且整个表数据量相对比较少,这个时候可以采用全量覆盖的操作.
操作方式:
	每次同步数据,都是要先将原有的数仓中标数据全部删除,然后重新从业务端导入即可,建表的时候,不需要构建分区表.
	比如说:地区表,时间表
2.仅新增同步方式
适用于业务端数据只会有新增的操作,不会有变更的时候,数据量比较多.
操作方式:
	在数仓中建表的时候,需要构建分区表,分区字段和同步数据的周期是一致,每次进行同步的时候,将对应周期下的新增数据放置到对应日期分区下
	比如说:登记日志表,访问日志表
3.新增及更新同步方式
适用于业务端数据既有更新操作,又有新增操作的时候,而且数据量比较多
操作方式:
	在数仓中建表的时候,需要构建分区表,分区字段和同步数据的周期是一致的.每次进行同步的时候,将对应这个周期的新增数据和更新数据放置到对应日期分区下即可.
	比如说:
	订单表,商品表,用户表....
4.全量同步方式
适用于业务端数据量不是特别大,但是也存在更新和新增,而且不需要保留太多的历史版本
操作方式:
	在数仓中建表的时候,需要构建分区表,分区字段和同步数据的周期是一致的,比如说: 每天都需要同步数据, 分区字段 需要按天  如果每月同步一次, 分区字段按照月,每次导入都是导入截止当前时间的全量数据, 定期将历史的日期数据删除即可

6.4中文乱码的问题

在这里插入图片描述
解决方案:
在mysql的hive库中, 执行一下SQL即可:

use hive;
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8 ;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;

6.5创建ODS层相关的表

1.创建库

drop database if exists yp_ods;
create  database if not exists yp_ods;

2.构建ods层表
建表说明:

ODS层表与 业务库的表保持一致, 也就说, 业务库中有哪些表, 那么我们就需要在ODS层构建有那些表, 表中到的字段也要一致, 额外在HIVE建表的时候, 需要多加一个分区字段, 用于标记数据在何时导入进来的.
然后判断, 那些表是属于全量覆盖的表, 那些表是属于仅新增的表, 那些表是属于全量及更新的表, 基于各个不同同步方式, 构建对应表即可.

6.6全量覆盖表

-- 区域表:   t_district
DROP TABLE if exists yp_ods.t_district;
CREATE TABLE yp_ods.t_district
(
    id string COMMENT '主键ID',
    code string COMMENT '区域编码',
    name string COMMENT '区域名称',
    pid  int COMMENT '父级ID',
    alias string COMMENT '别名'
)
comment '区域字典表'
row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 日期表:   t_date
drop table yp_ods.t_date; 
CREATE TABLE yp_ods.t_date ( 
    dim_date_id string COMMENT '日期', 
    date_code string COMMENT '日期编码', 
    lunar_calendar string COMMENT '农历', 
    year_code string COMMENT '年code', 
    year_name string COMMENT '年名称', 
    month_code string COMMENT '月份编码', 
    month_name string COMMENT '月份名称', 
    quanter_code string COMMENT '季度编码', 
    quanter_name string COMMENT '季度名称', 
    year_month string COMMENT '年月', 
    year_week_code string COMMENT '一年中第几周', 
    year_week_name string COMMENT '一年中第几周名称', 
    year_week_code_cn string COMMENT '一年中第几周(中国)', 
    year_week_name_cn string COMMENT '一年中第几周名称(中国',
    week_day_code string COMMENT '周几code', 
    week_day_name string COMMENT '周几名称', 
    day_week string COMMENT '周', 
    day_week_cn string COMMENT '周(中国)',
    day_week_num string COMMENT '一周第几天', 
    day_week_num_cn string COMMENT '一周第几天(中国)', 
    day_month_num string COMMENT '一月第几天', 
    day_year_num string COMMENT '一年第几天', 
    date_id_wow string COMMENT '与本周环比的上周日期', 
    date_id_mom string COMMENT '与本月环比的上月日期', 
    date_id_wyw string COMMENT '与本周同比的上年日期', 
    date_id_mym string COMMENT '与本月同比的上年日期', 
    first_date_id_month string COMMENT '本月第一天日期', 
    last_date_id_month string COMMENT '本月最后一天日期',
    half_year_code string COMMENT '半年code', 
    half_year_name string COMMENT '半年名称', 
    season_code string COMMENT '季节编码', 
    season_name string COMMENT '季节名称', 
    is_weekend string COMMENT '是否周末(周六和周日)', 
    official_holiday_code string COMMENT '法定节假日编码', 
    official_holiday_name string COMMENT '法定节假日', 
    festival_code string COMMENT '节日编码', 
    festival_name string COMMENT '节日', 
    custom_festival_code string COMMENT '自定义节日编码', 
    custom_festival_name string COMMENT '自定义节日', 
    update_time string COMMENT '更新时间' 
)
COMMENT '时间维度表' 
row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

6.7仅新增同步表

-- 订单评价表 : t_goods_evaluation
DROP TABLE if exists yp_ods.t_goods_evaluation;
CREATE TABLE yp_ods. ( 
	`id` string, 
	`user_id` string COMMENT '评论人id', 
	`store_id` string COMMENT '店铺id', 
	`order_id` string COMMENT '订单id', 
	`geval_scores` INT COMMENT '综合评分', 
	`geval_scores_speed` INT COMMENT '送货速度评分0-5分(配送评分)', 
	`geval_scores_service` INT COMMENT '服务评分0-5分', 
	`geval_isanony` TINYINT COMMENT '0-匿名评价,1-非匿名', 
	`create_user` string, 
	`create_time` string, 
	`update_user` string, 
	`update_time` string, 
	`is_valid` TINYINT COMMENT '0 :失效,1 :开启'
)
comment '商品评价表' 
partitioned by (dt string) 
row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 登录记录表:  t_user_login
DROP TABLE if exists yp_ods.t_user_login;
CREATE TABLE yp_ods.t_user_login( 
    id string, 
    login_user string, 
    login_type string COMMENT '登录类型(登陆时使用)',
    client_id string COMMENT '推送标示id(登录、第三方登录、注册、支付回调、给用户推送消息时使用)', 
    login_time string, 
    login_ip string, 
    logout_time string 
)
COMMENT '用户登录记录表' 
partitioned by (dt string)
row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 订单组支付表:  t_order_pay
DROP TABLE if exists yp_ods.t_order_pay;
CREATE TABLE yp_ods.t_order_pay ( 
    id string, 
    group_id string COMMENT '关联shop_order_group的group_id,一对多订单', 
    order_pay_amount DECIMAL(11,2) COMMENT '订单总金额;', 
    create_date string COMMENT '订单创建的时间,需要根据订单创建时间进行判断订单是否已经失效', 
    create_user string, 
    create_time string, 
    update_user string, 
    update_time string, 
    is_valid TINYINT COMMENT '是否有效 0: false; 1: true; 订单是否有效的标志'
)
comment '订单支付表' 
partitioned by (dt string) 
row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

6.8新增及更新同步表

-- 商品评价明细表 t_goods_evaluation_detail
DROP TABLE if exists yp_ods.t_goods_evaluation_detail;
CREATE TABLE yp_ods.t_goods_evaluation_detail
(
    id                              string,
    user_id                         string COMMENT '评论人id',
    store_id                        string COMMENT '店铺id',
    goods_id                        string COMMENT '商品id',
    order_id                        string COMMENT '订单id',
    order_goods_id                  string COMMENT '订单商品表id',
    geval_scores_goods              INT COMMENT '商品评分0-10分',
    geval_content                   string,
    geval_content_superaddition     string COMMENT '追加评论',
    geval_addtime                   string COMMENT '评论时间',
    geval_addtime_superaddition     string COMMENT '追加评论时间',
    geval_state                     TINYINT COMMENT '评价状态 1-正常 0-禁止显示',
    geval_remark                    string COMMENT '管理员对评价的处理备注',
    revert_state                    TINYINT COMMENT '回复状态0未回复1已回复',
    geval_explain                   string COMMENT '管理员回复内容',
    geval_explain_superaddition     string COMMENT '管理员追加回复内容',
    geval_explaintime               string COMMENT '管理员回复时间',
    geval_explaintime_superaddition string COMMENT '管理员追加回复时间',
    create_user                     string,
    create_time                     string,
    update_user                     string,
    update_time                     string,
    is_valid                        TINYINT COMMENT '0 :失效,1 :开启'
)
comment '商品评价明细'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 订单配送详细信息表 : t_order_delievery_item
DROP TABLE if exists yp_ods.t_order_delievery_item;
CREATE TABLE yp_ods.t_order_delievery_item
(
    id                     string COMMENT '主键id',
    shop_order_id          string COMMENT '订单表ID',
    refund_order_id        string,
    dispatcher_order_type  TINYINT COMMENT '配送订单类型1.支付单; 2.退款单',
    shop_store_id          string COMMENT '卖家店铺ID',
    buyer_id               string COMMENT '购买用户ID',
    circle_master_user_id  string COMMENT '圈主ID',
    dispatcher_user_id     string COMMENT '配送员ID',
    dispatcher_order_state TINYINT COMMENT '配送订单状态:0.待接单.1.已接单,2.已到店.3.配送中 4.商家普通提货码完成订单.5.商家万能提货码完成订单。6,买家完成订单',
    order_goods_num        TINYINT COMMENT '订单商品的个数',
    delivery_fee           DECIMAL(11,2) COMMENT '配送员的运费',
    distance               INT COMMENT '配送距离',
    dispatcher_code        string COMMENT '收货码',
    receiver_name          string COMMENT '收货人姓名',
    receiver_phone         string COMMENT '收货人电话',
    sender_name            string COMMENT '发货人姓名',
    sender_phone           string COMMENT '发货人电话',
    create_user            string,
    create_time            string,
    update_user            string,
    update_time            string,
    is_valid               TINYINT COMMENT '是否有效  0: false; 1: true'
)
comment '订单配送详细信息表'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 所有交易记录信息  t_trade_record
DROP TABLE if exists yp_ods.t_trade_record;
CREATE TABLE yp_ods.t_trade_record
(
    id                   string COMMENT '交易单号',
    external_trade_no    string COMMENT '(支付,结算.退款)第三方交易单号',
    relation_id          string COMMENT '关联单号',
    trade_type           TINYINT COMMENT '1.支付订单; 2.结算订单; 3.退款订单;4.充值单;5.提现单;6.分销单;7缴纳保证金单8退还保证金单9,冻结通联订单,10通联通账户余额充值,11.扫码单',
    status               TINYINT COMMENT '1.成功;2.失败;3.进行中',
    finnshed_time        string COMMENT '订单完成时间,当配送员点击确认送达时,进行更新订单完成时间,后期需要根据订单完成时间,进行自动收货以及自动评价',
    fail_reason          string COMMENT '交易失败的原因',
    payment_type         string COMMENT '支付方式:小程序,app微信,支付宝,快捷支付,钱包,银行卡,消费券',
    trade_before_balance DECIMAL(11,2) COMMENT '交易前余额',
    trade_true_amount    DECIMAL(11,2) COMMENT '交易实际支付金额,第三方平台扣除优惠以后实际支付金额',
    trade_after_balance  DECIMAL(11,2) COMMENT '交易后余额',
    note                 string COMMENT '业务说明',
    user_card            string COMMENT '第三方平台账户标识/多钱包用户钱包id',
    user_id              string COMMENT '用户id',
    aip_user_id          string COMMENT '钱包id',
    create_user          string,
    create_time          string,
    update_user          string,
    update_time          string,
    is_valid             TINYINT COMMENT '是否有效  0: false; 1: true;   订单是否有效的标志'
)
comment '所有交易记录信息'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 商圈表:  t_trade_area
DROP TABLE if exists yp_ods.t_trade_area;
CREATE TABLE yp_ods.t_trade_area
(
    id                  string COMMENT '主键',
    user_id             string COMMENT '用户ID',
    user_allinpay_id    string COMMENT '通联用户表id',
    trade_avatar        string COMMENT '商圈logo',
    name                string COMMENT '商圈名称',
    notice              string COMMENT '商圈公告',
    distric_province_id INT COMMENT '商圈所在省份ID',
    distric_city_id     INT COMMENT '商圈所在城市ID',
    distric_area_id     INT COMMENT '商圈所在县ID',
    address             string COMMENT '商圈地址',
    radius              double COMMENT '半径',
    mb_title_img        string COMMENT '手机商圈 页头背景图',
    deposit_amount      DECIMAL(11,2) COMMENT '商圈认购费用总额',
    hava_deposit        INT COMMENT '是否有交过保证金 1:是0:否',
    state               TINYINT COMMENT '申请商圈状态 -1 :未认购 ;0 :申请中;1 :已认购 ;',
    search_key          string COMMENT '商圈搜索关键字',
    create_user         string,
    create_time         string,
    update_user         string,
    update_time         string,
    is_valid            TINYINT COMMENT '是否有效  0: false; 1: true'
)
comment '商圈表'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 地址信息 : t_location
DROP TABLE if exists yp_ods.t_location;
CREATE TABLE yp_ods.t_location
(
    id string COMMENT '主键',
    type      INT COMMENT '类型   1:商圈地址;2:店铺地址;3.用户地址管理;4.订单买家地址信息;5.订单卖家地址信息',
    correlation_id string COMMENT '关联表id',
    address string COMMENT '地图地址详情',
    latitude  double COMMENT '纬度',
    longitude double COMMENT '经度',
    street_number string COMMENT '门牌',
    street string COMMENT '街道',
    district string COMMENT '区县',
    city string COMMENT '城市',
    province string COMMENT '省份',
    business string COMMENT '百度商圈字段,代表此点所属的商圈',
    create_user string,
    create_time string,
    update_user string,
    update_time string,
    is_valid  TINYINT COMMENT '是否有效  0: false; 1: true',
    adcode    string COMMENT '百度adcode,对应区县code'
)
comment '地址信息'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 商品表_店铺(SKU)
DROP TABLE if exists yp_ods.t_goods;
CREATE TABLE yp_ods.t_goods
(
    id                    string,
    store_id              string COMMENT '所属商店ID',
    class_id              string COMMENT '分类id:只保存最后一层分类id',
    store_class_id        string COMMENT '店铺分类id',
    brand_id              string COMMENT '品牌id',
    goods_name            string COMMENT '商品名称',
    goods_specification   string COMMENT '商品规格',
    search_name           string COMMENT '模糊搜索名称字段:名称_+真实名称',
    goods_sort            INT COMMENT '商品排序',
    goods_market_price    DECIMAL(11,2) COMMENT '商品市场价',
    goods_price           DECIMAL(11,2) COMMENT '商品销售价格(原价)',
    goods_promotion_price DECIMAL(11,2) COMMENT '商品促销价格(售价)',
    goods_storage         INT COMMENT '商品库存',
    goods_limit_num       INT COMMENT '购买限制数量',
    goods_unit            string COMMENT '计量单位',
    goods_state           TINYINT COMMENT '商品状态 1正常,2下架,3违规(禁售)',
    goods_verify          TINYINT COMMENT '商品审核状态: 1通过,2未通过,3审核中',
    activity_type         TINYINT COMMENT '活动类型:0无活动1促销2秒杀3折扣',
    discount              INT COMMENT '商品折扣(%)',
    seckill_begin_time    string COMMENT '秒杀开始时间',
    seckill_end_time      string COMMENT '秒杀结束时间',
    seckill_total_pay_num INT COMMENT '已秒杀数量',
    seckill_total_num     INT COMMENT '秒杀总数限制',
    seckill_price         DECIMAL(11,2) COMMENT '秒杀价格',
    top_it                TINYINT COMMENT '商品置顶:1-是,0-否',
    create_user           string,
    create_time           string,
    update_user           string,
    update_time           string,
    is_valid              TINYINT COMMENT '0 :失效,1 :开启'
)
comment '商品表_店铺(SKU)'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 商品分类_店铺
DROP TABLE if exists yp_ods.t_goods_class;
CREATE TABLE yp_ods.t_goods_class
(
    id             string,
    store_id       string COMMENT '店铺id',
    class_id       string COMMENT '对应的平台分类表id',
    name           string COMMENT '店铺内分类名字',
    parent_id      string COMMENT '父id',
    level          TINYINT COMMENT '分类层级',
    is_parent_node TINYINT COMMENT '是否为父节点:1是0否',
    background_img string COMMENT '背景图片',
    img            string COMMENT '分类图片',
    keywords       string COMMENT '关键词',
    title          string COMMENT '搜索标题',
    sort           INT COMMENT '排序',
    note           string COMMENT '类型描述',
    url            string COMMENT '分类的链接',
    is_use         TINYINT COMMENT '是否使用:0否,1是',
    create_user    string,
    create_time    string,
    update_user    string,
    update_time    string,
    is_valid       TINYINT COMMENT '0 :失效,1 :开启'
)
comment '商品分类_店铺'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 品牌(店铺)
DROP TABLE if exists yp_ods.t_brand;
CREATE TABLE yp_ods.t_brand
(
    id          string,
    store_id    string COMMENT '店铺id',
    brand_pt_id string COMMENT '平台品牌库品牌Id',
    brand_name  string COMMENT '品牌名称',
    brand_image string COMMENT '品牌图片',
    initial     string COMMENT '品牌首字母',
    sort        INT COMMENT '排序',
    is_use      TINYINT COMMENT '0禁用1启用',
    goods_state TINYINT COMMENT '商品品牌审核状态 1 审核中,2 通过,3 拒绝',
    create_user string,
    create_time string,
    update_user string,
    update_time string,
    is_valid    TINYINT COMMENT '0 :失效,1 :开启'
)
comment '品牌(店铺)'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress'='ZLIB');

-- 订单表
DROP TABLE if exists yp_ods.t_shop_order;
CREATE TABLE yp_ods.t_shop_order
(
    id               string COMMENT '根据一定规则生成的订单编号',
    order_num        string COMMENT '订单序号',
    buyer_id         string COMMENT '买家的userId',
    store_id         string COMMENT '店铺的id',
    order_from       TINYINT COMMENT '是来自于app还是小程序,或者pc 1.安卓; 2.ios; 3.小程序H5 ; 4.PC',
    order_state      INT COMMENT '订单状态:1.已下单; 2.已付款, 3. 已确认 ;4.配送; 5.已完成; 6.退款;7.已取消',
    create_date      string COMMENT '下单时间',
    finnshed_time    timestamp COMMENT '订单完成时间,当配送员点击确认送达时,进行更新订单完成时间,后期需要根据订单完成时间,进行自动收货以及自动评价',
    is_settlement    TINYINT COMMENT '是否结算;0.待结算订单; 1.已结算订单;',
    is_delete        TINYINT COMMENT '订单评价的状态:0.未删除;  1.已删除;(默认0)',
    evaluation_state TINYINT COMMENT '订单评价的状态:0.未评价;  1.已评价;(默认0)',
    way              string COMMENT '取货方式:SELF自提;SHOP店铺负责配送',
    is_stock_up      INT COMMENT '是否需要备货 0:不需要    1:需要    2:平台确认备货  3:已完成备货 4平台已经将货物送至店铺 ',
    create_user      string,
    create_time      string,
    update_user      string,
    update_time      string,
    is_valid         TINYINT COMMENT '是否有效  0: false; 1: true;   订单是否有效的标志'
)
comment '订单表'
partitioned by (dt string)
row format delimited fields terminated by '\t'
stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 订单详情表
DROP TABLE if exists yp_ods.t_shop_order_address_detail;
CREATE TABLE yp_ods.t_shop_order_address_detail
(
    id                  string COMMENT '关联订单的id',
    order_amount        DECIMAL(11,2) COMMENT '订单总金额:购买总金额-优惠金额',
    discount_amount     DECIMAL(11,2) COMMENT '优惠金额',
    goods_amount        DECIMAL(11,2) COMMENT '用户购买的商品的总金额+运费',
    is_delivery         string COMMENT '0.自提;1.配送',
    buyer_notes         string COMMENT '买家备注留言',
    pay_time            string,
    receive_time        string,
    delivery_begin_time string,
    arrive_store_time   string,
    arrive_time         string COMMENT '订单完成时间,当配送员点击确认送达时,进行更新订单完成时间,后期需要根据订单完成时间,进行自动收货以及自动评价',
    create_user         string,
    create_time         string,
    update_user         string,
    update_time         string,
    is_valid            TINYINT COMMENT '是否有效  0: false; 1: true;   订单是否有效的标志'
)
 comment '订单详情表'
 partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');
 
-- 订单结算表
DROP TABLE if exists yp_ods.t_order_settle;
CREATE TABLE yp_ods.t_order_settle
(
    id                        string COMMENT '结算单号',
    order_id                  string,
    settlement_create_date    string COMMENT '用户申请结算的时间',
    settlement_amount         DECIMAL(11,2) COMMENT '如果发生退款,则结算的金额 = 订单的总金额 - 退款的金额',
    dispatcher_user_id        string COMMENT '配送员id',
    dispatcher_money          DECIMAL(11,2) COMMENT '配送员的配送费(配送员的运费(如果退货方式为1:则买家支付配送费))',
    circle_master_user_id     string COMMENT '圈主id',
    circle_master_money       DECIMAL(11,2) COMMENT '圈主分润的金额',
    plat_fee                  DECIMAL(11,2) COMMENT '平台应得的分润',
    store_money               DECIMAL(11,2) COMMENT '商家应得的订单金额',
    status                    TINYINT COMMENT '0.待结算;1.待审核 ; 2.完成结算;3.拒绝结算',
    note                      string COMMENT '原因',
    settle_time               string COMMENT ' 结算时间',
    create_user               string,
    create_time               string,
    update_user               string,
    update_time               string,
    is_valid                  TINYINT COMMENT '是否有效  0: false; 1: true;   订单是否有效的标志',
    first_commission_user_id  string COMMENT '一级分佣用户',
    first_commission_money    DECIMAL(11,2) COMMENT '一级分佣金额',
    second_commission_user_id string COMMENT '二级分佣用户',
    second_commission_money   DECIMAL(11,2) COMMENT '二级分佣金额'
)
comment '订单结算表'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 退款订单表
DROP TABLE if exists yp_ods.t_refund_order;
CREATE TABLE yp_ods.t_refund_order
(
    id                   string COMMENT '退款单号',
    order_id             string COMMENT '订单的id',
    apply_date           string COMMENT '用户申请退款的时间',
    modify_date          string COMMENT '退款订单更新时间',
    refund_reason        string COMMENT '买家退款原因',
    refund_amount        DECIMAL(11,2) COMMENT '订单退款的金额',
    refund_state         TINYINT COMMENT '1.申请退款;2.拒绝退款; 3.同意退款,配送员配送; 4:商家同意退款,用户亲自送货 ;5.退款完成',
    refuse_refund_reason string COMMENT '商家拒绝退款原因',
    refund_goods_type    string COMMENT '1.上门取货(买家承担运费); 2.买家送达;',
    refund_shipping_fee  DECIMAL(11,2) COMMENT '配送员的运费(如果退货方式为1:则买家支付配送费)',
    create_user          string,
    create_time          string,
    update_user          string,
    update_time          string,
    is_valid             TINYINT COMMENT '是否有效  0: false; 1: true;   订单是否有效的标志'
)
comment '退款订单表'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 订单分组表
DROP TABLE if exists yp_ods.t_shop_order_group;
CREATE TABLE yp_ods.t_shop_order_group
(
    id          string,
    order_id    string COMMENT '订单id',
    group_id    string COMMENT '订单分组id',
    is_pay      TINYINT COMMENT '是否已支付,0未支付,1已支付',
    create_user string,
    create_time string,
    update_user string,
    update_time string,
    is_valid    TINYINT
)
comment '订单分组表'
partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc tblproperties ('orc.compress' = 'ZLIB');

-- 店铺表
DROP TABLE if exists yp_ods.t_store; 
CREATE TABLE yp_ods.t_store ( 
    `id` string COMMENT '主键', 
    `user_id` string, 
    `store_avatar` string COMMENT '店铺头像', 
    `address_info` string COMMENT '店铺详细地址', 
    `name` string COMMENT '店铺名称', 
    `store_phone` string COMMENT '联系电话', 
    `province_id` INT COMMENT '店铺所在省份ID', 
    `city_id` INT COMMENT '店铺所在城市ID', 
    `area_id` INT COMMENT '店铺所在县ID', 
    `mb_title_img` string COMMENT '手机店铺 页头背景图',
    `store_description` string COMMENT '店铺描述', 
    `notice` string COMMENT '店铺公告', 
    `is_pay_bond` TINYINT COMMENT '是否有
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值