新零售项目
1.新零售概述
1.1行业背景
早起基本上都是一些线下店铺:
阶段一:百货商店
阶段二:超级市场
阶段三:连锁商店
阶段四:电子商务(网络销售--网店)
阶段五:新零售(线上+线下+物流)
1.2业务模块介绍
1.商品发布流程
2.单店铺订单流程
3.购物车流程
4.配送流程图
5.退货业务流程图
6.项目架构图
- 基于cloudera manager构建的大数据分析平台, 在此平台基础上, 构建有 HDFS, YARN, zookeeper,
sqoop, oozie, HUE, HIVE 等相关的大数据组件, 同时为了提升分析的效率. 引入presto来进行分析处理操作,
使用FineBi实现图表展示操作, 整个分析工作是一个周而复始, 不断的干, 采用oozie完成任务的调度工作 - 数据流转的流程: 整个项目的数据源都是集中在MySQL中的, 通过sqoop完成数据的导入操作, 将数据导入到HDFS中,
使用HIVE构建相关的表, 建立数仓体系, 在HIVE进行分层处理, 在进行统计分析的时候, 采用presto提升分析的效率,
将分析的结果导出到Mysql中, 最后使用fineBi完成报表展示操作, 整个项目基于cloudera manager进行监控管理,
使用oozie完成工作流的调度操作
1.3clouderamanager工具介绍
- cloudera manager 是一款大数据的统一监控管理平台, 此平台主要是对cloudera公司旗下CDH版本软件进行管理工作,
- 提供的服务: 统一的监控, 自动化部署, 对CDH软件进行相关管理. 产生原因: apache版本软件所存在弊端:
部署过程极其复杂,超过20个节点的时候,手动部署已经超级累 各个组件部署完成后,各个为政,没有统一化管理界面
组件和组件之间的依赖关系很复杂,一环扣一环,部署过程心累
各个组件之间没有统一的metric可视化界面,比如说hdfs总共占用的磁盘空间、IO、运行状况等
优化等需要用户自己根据业务场景进行调整(需要手工的对每个节点添加更改配置,效率极低,我们希望的是一个配置能够自动的分发到所有的节点上)
市场需要有一款统一软件, 对大数据中各个组件进行统一化管理操作, 由此产生cloudera manager 另一个原因:
cloudera 公司希望能够有更多客户使用CDH版本, 降低客户使用难度
1.4项目环境部署操作
- 将资料中提供虚拟机压缩包, 解压到一个没有中文没有空格, 以及磁盘空间相对充足的磁盘中(大于100GB)
- 修改VMware的网卡设置: 统一修改为 88网段, 网关为192.168.88.2
- 在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 '是否有