大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧!!!非常感谢!!持续更新!!!

Java篇开始了!

目前开始更新 MyBatis,一起深入浅出!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(已更完)
  • Prometheus(已更完)
  • Grafana(已更完)
  • 离线数仓(正在更新…)

章节内容

上节我们完成了如下的内容:

  • ODS层的构建 Hive处理
  • UDF 处理
  • SerDe 处理
  • 当前总结

在这里插入图片描述

活跃会员

  • 活跃会员:打开应用的会员即为活跃会员
  • 新增会员:第一次使用英勇的会员,定义为新增会员
  • 留存会员:某段时间新增会员,经过一段时间后,仍继续使用应用认为是留存会员
  • 活跃会员的指标需求:每日、每周、每月的活跃会员数

DWD:会员的每日启动信息明细(会员都是活跃会员,某个会员可能会出现多次)
DWS:每日活跃会员信息(关键)、每周活跃会员信息、每月活跃会员信息
每日活跃会员信息 => 每周活跃会员信息
每日活跃会员信息 => 每月活跃会员信息
ADS:每日、每周、每月活跃会员数(输出)

ADS表结构:daycnt weekcnt monthcnt dt

备注:周、月为自然周、自然月

处理过程:

  • 建表(每日、每周、每月活跃会员信息)
  • 每日启动明细 => 每日活跃会员
  • 每日活跃会员 => 每周活跃会员;每日活跃会员 => 每月活跃会员
  • 汇总生成ADS层的数据

创建DWS层表

DWS作用

统一数据模型

将原始数据(ODS层)按照一定的逻辑模型进行整合、清洗、加工,形成标准化的数据结构。
支持对数据的多维度、多粒度分析。

支持业务场景

满足企业对历史数据的查询和分析需求。
支持 OLAP(在线分析处理)操作,如聚合查询、钻取和切片。

数据细化与分类

将数据按照主题域(如销售、财务、库存等)分类,便于管理和查询。
通常保持较高的细节粒度,便于灵活扩展。

数据准确性与一致性

经过处理的数据经过校验,确保逻辑关系正确,能够为下游提供准确的一致性数据。

编写脚本

启动Hive,进行执行:

use dws;
drop table if exists dws.dws_member_start_day;
create table dws.dws_member_start_day
(`device_id` string,`uid` string,`app_v` string,`os_type` string,`language` string,`channel` string,`area` string,`brand` string
) COMMENT '会员日启动汇总'
partitioned by(dt string)
stored as parquet;
drop table if exists dws.dws_member_start_week;
create table dws.dws_member_start_week(`device_id` string,`uid` string,`app_v` string,`os_type` string,`language` string,`channel` string,`area` string,`brand` string,`week` string
) COMMENT '会员周启动汇总'
PARTITIONED BY (`dt` string)
stored as parquet;
drop table if exists dws.dws_member_start_month;
create table dws.dws_member_start_month(`device_id` string,`uid` string,`app_v` string,`os_type` string,`language` string,`channel` string,`area` string,`brand` string,`month` string
) COMMENT '会员月启动汇总'
PARTITIONED BY (`dt` string)
stored as parquet;

执行结果如下图所示:
在这里插入图片描述

加载DWS层数据

vim /opt/wzk/hive/dws_load_member_start.sh

写入的内容如下所示:

#!/bin/bash
source /etc/profile
# 可以输入日期;如果未输入日期取昨天的时间
if [ -n "$1" ]
then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
# 定义要执行的SQL
# 汇总得到每日活跃会员信息;每日数据汇总得到每周、每月数据
sql="
insert overwrite table dws.dws_member_start_day
partition(dt='$do_date')
select device_id,
concat_ws('|', collect_set(uid)),
concat_ws('|', collect_set(app_v)),
concat_ws('|', collect_set(os_type)),
concat_ws('|', collect_set(language)),
concat_ws('|', collect_set(channel)),
concat_ws('|', collect_set(area)),
concat_ws('|', collect_set(brand))
from dwd.dwd_start_log
where dt='$do_date'
group by device_id;
-- 汇总得到每周活跃会员
insert overwrite table dws.dws_member_start_week
partition(dt='$do_date')
select device_id,
concat_ws('|', collect_set(uid)),
concat_ws('|', collect_set(app_v)),
concat_ws('|', collect_set(os_type)),
concat_ws('|', collect_set(language)),
concat_ws('|', collect_set(channel)),
concat_ws('|', collect_set(area)),
concat_ws('|', collect_set(brand)),
date_add(next_day('$do_date', 'mo'), -7)
from dws.dws_member_start_day
where dt >= date_add(next_day('$do_date', 'mo'), -7)
and dt <= '$do_date'
group by device_id;
-- 汇总得到每月活跃会员
insert overwrite table dws.dws_member_start_month
partition(dt='$do_date')
select device_id,
concat_ws('|', collect_set(uid)),
concat_ws('|', collect_set(app_v)),
concat_ws('|', collect_set(os_type)),
concat_ws('|', collect_set(language)),
concat_ws('|', collect_set(channel)),
concat_ws('|', collect_set(area)),
concat_ws('|', collect_set(brand)),
date_format('$do_date', 'yyyy-MM')
from dws.dws_member_start_day
where dt >= date_format('$do_date', 'yyyy-MM-01')
and dt <= '$do_date'
group by device_id;
"
hive -e "$sql"

注意Shell的引号。
写入的内容如下图所示:
在这里插入图片描述
ODS => DWD => DWS(每日、每周、每月活跃会员的汇总表)

创建ADS层表

ADS 作用

聚合和简化数据

将 DWS 层中多表、多主题域的数据聚合成简单易用的表或视图。
直接输出满足业务需求的数据结果。

面向业务应用

通过设计宽表或高性能视图,直接支持具体的业务场景和报表需求。
响应快速查询需求,如实时数据的展示。

数据分发与集成

为前端的 BI 工具、报表系统或 API 服务提供高效的查询接口。
能够通过缓存机制或物化视图加速查询性能。

轻量化与高性能

尽量减少数据量,保留业务最关心的关键指标。
采用预聚合、预计算等技术提升查询效率。

计算当天、当周、当月活跃会员数量

drop table if exists ads.ads_member_active_count;
create table ads.ads_member_active_count(`day_count` int COMMENT '当日会员数量',`week_count` int COMMENT '当周会员数量',`month_count` int COMMENT '当月会员数量'
) COMMENT '活跃会员数'
partitioned by(dt string)
row format delimited fields terminated by ',';

执行结果如下图所示:
在这里插入图片描述

加载ADS层数据

vim /opt/wzk/hive/ads_load_memeber_active.sh

写入的内容如下:

#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
with tmp as(select 'day' datelabel, count(*) cnt, dtfrom dws.dws_member_start_daywhere dt='$do_date'group by dtunion allselect 'week' datelabel, count(*) cnt, dtfrom dws.dws_member_start_weekwhere dt='$do_date'group by dtunion allselect 'month' datelabel, count(*) cnt, dtfrom dws.dws_member_start_monthwhere dt='$do_date'group by dt
)
insert overwrite table ads.ads_member_active_count
partition(dt='$do_date')
select sum(case when datelabel='day' then cnt end) as
day_count,
sum(case when datelabel='week' then cnt end) as
week_count,
sum(case when datelabel='month' then cnt end) as
month_count
from tmp
group by dt;
"
hive -e "$sql"

写入内容如下图所示:
在这里插入图片描述
这里有一个同样功能的脚本,可以参考对比以下:

vim /opt/wzk/hive/ads_load_memeber_active2.sh

写入内容如下:

#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
insert overwrite table ads.ads_member_active_count
partition(dt='$do_date')
select daycnt, weekcnt, monthcnt
from (select dt, count(*) daycntfrom dws.dws_member_start_daywhere dt='$do_date'group by dt) day join
(select dt, count(*) weekcntfrom dws.dws_member_start_weekwhere dt='$do_date'group by dt
) week on day.dt=week.dt
join
(select dt, count(*) monthcntfrom dws.dws_member_start_monthwhere dt='$do_date'group by dt
) month on day.dt=month.dt;
"
hive -e "$sql"

写入内容如下图所示:
在这里插入图片描述

  • 第一个脚本:通过构建临时表(WITH tmp AS (…))将不同维度的数据(天、周、月)汇总到一个临时表中,再通过 SUM 计算出最终的统计结果。这种方式的灵活性较高,便于扩展。
  • 第二个脚本:直接通过 JOIN 不同的子查询,将天、周、月三个维度的数据联结在一起,最后插入目标表。这种方式在性能上可能更高效,但扩展性稍差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode_有序数组中的单一元素

540. 有序数组中的单一元素 - 力扣&#xff08;LeetCode&#xff09; 二分查找 使用条件 &#xff1a; 有序 &#xff0c; log n class Solution { public:int singleNonDuplicate(vector<int>& nums) {int left 0, right nums.size() - 1, mid;while (left <…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

USRP:B205mini-i

USRP B205mini-i B205mini-i都是采用工业级的FPGA芯片(-I表示industrial-grade)&#xff0c;所以价格贵。 这个工业级会让工作温度从原来 0 – 45 C 变为 -40 – 75 C. 温度的扩宽&#xff0c;会让工作的稳定性变好。但是前提是你需要配合NI的外壳才行&#xff0c;你如果只买一…

React 常见问题解答:设置、安装、用户事件和最佳实践

在本文中&#xff0c;我们将回答您在开始使用 React 时可能会问的 9 个常见问题。 1、开始使用 React 需要哪些技能和知识&#xff1f; 在深入研究 React 之前&#xff0c;您应该对以下内容有深入的了解&#xff1a; HTML、CSS 和 JavaScript &#xff08;ES6&#xff09;&a…

基于Redis内核的热key统计实现方案|得物技术

一、Redis热key介绍 Redis热key问题是指单位时间内&#xff0c;某个特定key的访问量特别高&#xff0c;占用大量的CPU资源&#xff0c;影响其他请求并导致整体性能降低。而且&#xff0c;如果访问热key的命令是时间复杂度较高的命令&#xff0c;会使得CPU消耗变得更加严重&…

鸿蒙安全控件之位置控件简介

位置控件使用直观且易懂的通用标识&#xff0c;让用户明确地知道这是一个获取位置信息的按钮。这满足了授权场景需要匹配用户真实意图的需求。只有当用户主观愿意&#xff0c;并且明确了解使用场景后点击位置控件&#xff0c;应用才会获得临时的授权&#xff0c;获取位置信息并…

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…

spring boot有那些优势?

Spring Boot 作为 Spring 框架的一个扩展&#xff0c;旨在简化新 Spring 应用程序的初始搭建以及开发过程。它通过提供一系列默认配置来快速启动基于 Spring 的应用&#xff0c;并且减少了大量的样板代码和配置工作。以下是使用 Spring Boot 的一些主要优势&#xff1a; 简化配…

Jackson库中JsonInclude的使用

简介 JsonInclude是 Jackson 库&#xff08;Java 中用于处理 JSON 数据的流行库&#xff09;中的一个注解。它用于控制在序列化 Java 对象为 JSON 时&#xff0c;哪些属性应该被包含在 JSON 输出中。这个注解提供了多种策略来决定属性的包含与否&#xff0c;帮助减少不必要的数…

JavaFX:简介、使用场景、常见问题及对比其他框架分析

1. JavaFX 简介 1.1 什么是 JavaFX&#xff1f; JavaFX 是一个基于 Java 的 GUI 工具包&#xff0c;支持创建桌面和互联网应用。它通过 Scene Graph&#xff08;场景图&#xff09;模型渲染 UI 元素&#xff0c;并采用声明式编程风格。自 JDK 11 起&#xff0c;JavaFX 被移除…

88页精品PPT | 某电信集团大数据平台建设方案技术交流

这份PPT文档是关于某电信集团大数据平台建设的技术交流方案&#xff0c;内容涵盖了现状分析、规划思路、产品设计、成功案例以及干货附录等多个部分。文档详细介绍了集团大数据平台的建设背景、技术特点、面临的挑战和痛点&#xff0c;以及具体的技术架构和实施策略。还包括了数…

Java设计模式笔记(一)

Java设计模式笔记&#xff08;一&#xff09; &#xff08;23种设计模式由于篇幅较大分为两篇展示&#xff09; 一、设计模式介绍 1、设计模式的目的 让程序具有更好的&#xff1a; 代码重用性可读性可扩展性可靠性高内聚&#xff0c;低耦合 2、设计模式的七大原则 单一职…

在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?

一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换&#xff0c;将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说&#xff0c;PCA算法包括以下几个步骤&#xff1a…

shodan(7)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

三维地形图计算软件(三)-原基于PYQT5+pyqtgraph旧代码

最先入手设计三维地形图及平基挖填方计算软件时&#xff0c;地形图的显示方案是&#xff1a;三维视图基于pyqtgraph.opengl显示和二维视图基于pyqtgraph的PlotWidget来显示地形地貌&#xff0c;作到一半时就发现&#xff0c;地形点过多时&#xff0c;将会造成系统卡顿(加载时主…

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…

集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解

1、 Queue与Deque的区别 在研究java集合源码的时候&#xff0c;发现了一个很少用但是很有趣的点&#xff1a;Queue以及Deque&#xff1b; 平常在写leetcode经常用LinkedList向上转型Deque作为栈或者队列使用&#xff0c;但是一直都不知道Queue的作用&#xff0c;于是就直接官方…

Qwen2.5-7B大模型微调记录

Qwen2.5-7B大模型微调记录 研究需要&#xff0c;需要搞一个大模型出来&#xff0c;没有太多的时间自己训练&#xff0c;准备用现成的开源大模型&#xff0c;然后结合研究方向进行微调 前前后后折腾大半个月&#xff0c;总算做完了第一个微调的大模型&#xff0c;模型基于阿里…

Spring Boot 开发环境搭建及示例应用

文章目录 1. 准备开发工具安装 JDK安装 IDE安装 Maven 2. 创建 Spring Boot 项目使用 Spring Initializr 创建项目导入项目到 IDE 3. 编写代码主类创建控制器创建实体类创建仓库接口创建服务类创建控制器 4. 配置文件5. 运行应用程序6. 测试应用程序7. 调试与优化8. 部署应用 1…

CentOS Docker 安装

CentOS Docker 安装 1. 简介 CentOS 是一个基于 Red Hat Enterprise Linux (RHEL) 的开源操作系统&#xff0c;广泛用于服务器环境。Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的…