数仓搭建(hive):DWS层(服务数据层)

DWS层示例: 搭建日主题宽表

需求

维度

步骤

在hive中建数据库dws >>建表
CREATE DATABASE if NOT EXISTS DWS;
建表sql
CREATE TABLE yp_dws.dws_sale_daycount(
--维度
city_id string COMMENT '城市id',
city_name string COMMENT '城市name',
trade_area_id string COMMENT '商圈id',
trade_area_name string COMMENT '商圈名称',
store_id string COMMENT '店铺的id',
store_name string COMMENT '店铺名称',
brand_id string COMMENT '品牌id',
brand_name string COMMENT '品牌名称',
max_class_id string COMMENT '商品大类id',
max_class_name string COMMENT '大类名称',
mid_class_id string COMMENT '中类id',
mid_class_name string COMMENT '中类名称',
min_class_id string COMMENT '小类id',
min_class_name string COMMENT '小类名称',
group_type string COMMENT '分组类型:store,trade_area,city,brand,
min_class,mid_class,max_class,all',
-- =======日统计=======
sale_amt DECIMAL(38,2) COMMENT '销售收入',
plat_amt DECIMAL(38,2) COMMENT '平台收入',
deliver_sale_amt DECIMAL(38,2) COMMENT '配送成交额',
mini_app_sale_amt DECIMAL(38,2) COMMENT '小程序成交额',
android_sale_amt DECIMAL(38,2) COMMENT '安卓APP成交额',
ios_sale_amt DECIMAL(38,2) COMMENT '苹果APP成交额',
pcweb_sale_amt DECIMAL(38,2) COMMENT 'PC商城成交额',
order_cnt BIGINT COMMENT '成交单量',
eva_order_cnt BIGINT COMMENT '参评单量comment=>cmt',
bad_eva_order_cnt BIGINT COMMENT '差评单量negtive-comment=>ncmt',
deliver_order_cnt BIGINT COMMENT '配送单量',
refund_order_cnt BIGINT COMMENT '退款单量',
miniapp_order_cnt BIGINT COMMENT '小程序成交单量',
android_order_cnt BIGINT COMMENT '安卓APP订单量',
ios_order_cnt BIGINT COMMENT '苹果APP订单量',
pcweb_order_cnt BIGINT COMMENT 'PC商城成交单量'
)
COMMENT '销售主题日统计宽表'
PARTITIONED BY(dt STRING)
ROW format delimited fields terminated BY '\t'
stored AS orc tblproperties ('orc.compress' = 'SNAPPY');
查询数据sql
set hive.exec.mode.local.auto=true;
WITH TEMP AS (SELECT-- 先抽取维度字段O.dt-- 城市,S.city_id,S.city_name-- 商圈,S.trade_area_id,S.trade_area_name-- 店铺,S.id,S.store_name-- 品牌,G.brand_id,G.brand_name-- 大类,G.max_class_id,G.max_class_name-- 中,G.mid_class_id,G.mid_class_name-- 小,G.min_class_id,G.min_class_name-- 抽取字段字段-- 订单量指标,O.order_id-- 金额指标,O.order_amount,O.goods_price,O.plat_fee,O.settlement_amount,O.dispatcher_money,O.order_from,O.evaluation_state,O.geval_scores,O.is_delivery  -- 是否配送,O.refund_id  -- 退款单号-- 去重,ROW_NUMBER()OVER(PARTITION BY O.order_id ORDER BY order_id) RNFROM DWB.DWB_ORDER_DETAIL1 OLEFT JOIN DWB.DWB_SHOP_DETAIL SON O.store_id = S.idLEFT JOIN DWB.dwb_goods_detail GON G.store_id = S.id
)
SELECTT.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.ID AS STORE_ID,T.store_name,T.brand_id,T.brand_name,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name,(CASE WHEN T.ID IS NOT NULLTHEN '店铺'WHEN T.trade_area_id IS NOT NULLTHEN '商圈'WHEN T.city_id IS NOT NULLTHEN '城市'WHEN T.min_class_id IS NOT NULLTHEN '小类'WHEN T.mid_class_id IS NOT NULLTHEN '中类'WHEN T.max_class_id IS NOT NULLTHEN '大类'WHEN T.brand_id IS NOT NULLTHEN '品牌'ELSE '日期'END)  AS GROUP_TYPE,SUM(CASE WHEN RN = 1 THEN T.order_amount END) AS SALE_AMT,SUM(CASE WHEN RN = 1 THEN T.plat_fee END) AS PLAT_AMT,SUM(CASE WHEN RN = 1 AND T.is_delivery = 1 THEN T.order_amount END) AS DELIVER_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'miniapp' THEN T.order_amount END) AS MINI_APP_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'android' THEN T.order_amount END) AS android_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'ios' THEN T.order_amount END) AS ios_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'pcweb' THEN T.order_amount END) AS PCWEB_SALE_AMT,COUNT(CASE WHEN RN = 1 THEN T.order_id END ) AS ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.evaluation_state = 1 THEN 1 END) AS EVA_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.geval_scores < 3 THEN 1 END) AS BAD_EVA_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.is_delivery = 1 THEN 1 END) AS DELIVER_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.refund_id IS NOT NULL THEN 1 END) AS  REFUND_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'miniapp' THEN 1 END) AS MINI_APP_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'android' THEN 1 END) AS android_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'ios' THEN 1 END) AS ios_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'pcweb' THEN 1 END) AS PCWEB_SALE_CNT,T.dtFROM TEMP T
GROUP BYT.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.id,T.store_name,T.brand_id,T.brand_name,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name
GROUPING SETS ((T.dt),(T.dt,T.city_id,T.city_name),(T.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name),(T.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.id,T.store_name),(T.dt,T.brand_id,T.brand_name),(T.dt,T.max_class_id,T.max_class_name),(T.dt,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name),(T.dt,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name)
);

在hive中查询数据很慢

方法一:

打开hive的本地模式 (默认是false关闭状态)
set hive.exec.mode.local.auto=true;

方法二: Hue上执行

插入数据

查看表结构

要插入的目标表是分区表 >> 开启动态插入模式/非严格模式

在hive中,insert into 要紧跟select

set hive.exec.mode.local.auto=true; -- 本地模式
SET hive.exec.dynamic.partition = true; -- 动态分区
SET hive.exec.dynamic.partition.mode=nonstrict; -- 非严格模式
WITH TEMP AS (SELECT-- 先抽取维度字段O.dt-- 城市,S.city_id,S.city_name-- 商圈,S.trade_area_id,S.trade_area_name-- 店铺,S.id,S.store_name-- 品牌,G.brand_id,G.brand_name-- 大类,G.max_class_id,G.max_class_name-- 中,G.mid_class_id,G.mid_class_name-- 小,G.min_class_id,G.min_class_name-- 抽取字段字段-- 订单量指标,O.order_id-- 金额指标,O.order_amount,O.goods_price,O.plat_fee,O.settlement_amount,O.dispatcher_money,O.order_from,O.evaluation_state,O.geval_scores,O.is_delivery  -- 是否配送,O.refund_id  -- 退款单号-- 去重,ROW_NUMBER()OVER(PARTITION BY O.order_id ORDER BY order_id) RNFROM DWB.DWB_ORDER_DETAIL1 OLEFT JOIN DWB.DWB_SHOP_DETAIL SON O.store_id = S.idLEFT JOIN DWB.dwb_goods_detail GON G.store_id = S.id
)insert into dws.dws_sale_daycount(dt)SELECTT.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.ID AS STORE_ID,T.store_name,T.brand_id,T.brand_name,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name,(CASE WHEN T.ID IS NOT NULLTHEN '店铺'WHEN T.trade_area_id IS NOT NULLTHEN '商圈'WHEN T.city_id IS NOT NULLTHEN '城市'WHEN T.min_class_id IS NOT NULLTHEN '小类'WHEN T.mid_class_id IS NOT NULLTHEN '中类'WHEN T.max_class_id IS NOT NULLTHEN '大类'WHEN T.brand_id IS NOT NULLTHEN '品牌'ELSE '日期'END)  AS GROUP_TYPE,SUM(CASE WHEN RN = 1 THEN T.order_amount END) AS SALE_AMT,SUM(CASE WHEN RN = 1 THEN T.plat_fee END) AS PLAT_AMT,SUM(CASE WHEN RN = 1 AND T.is_delivery = 1 THEN T.order_amount END) AS DELIVER_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'miniapp' THEN T.order_amount END) AS MINI_APP_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'android' THEN T.order_amount END) AS android_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'ios' THEN T.order_amount END) AS ios_SALE_AMT,SUM(CASE WHEN RN = 1 AND T.order_from = 'pcweb' THEN T.order_amount END) AS PCWEB_SALE_AMT,COUNT(CASE WHEN RN = 1 THEN T.order_id END ) AS ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.evaluation_state = 1 THEN 1 END) AS EVA_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.geval_scores < 3 THEN 1 END) AS BAD_EVA_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.is_delivery = 1 THEN 1 END) AS DELIVER_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.refund_id IS NOT NULL THEN 1 END) AS  REFUND_ORDER_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'miniapp' THEN 1 END) AS MINI_APP_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'android' THEN 1 END) AS android_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'ios' THEN 1 END) AS ios_SALE_CNT,COUNT(CASE WHEN RN = 1 AND T.order_from = 'pcweb' THEN 1 END) AS PCWEB_SALE_CNT,T.dtFROM TEMP T
GROUP BYT.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.id,T.store_name,T.brand_id,T.brand_name,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name
GROUPING SETS ((T.dt),(T.dt,T.city_id,T.city_name),(T.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name),(T.dt,T.city_id,T.city_name,T.trade_area_id,T.trade_area_name,T.id,T.store_name),(T.dt,T.brand_id,T.brand_name),(T.dt,T.max_class_id,T.max_class_name),(T.dt,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name),(T.dt,T.max_class_id,T.max_class_name,T.mid_class_id,T.mid_class_name,T.min_class_id,T.min_class_name)
);​

查询数据sql分析

数据来源>>DWB层的数据表

下面分析维度/指标需要哪些数据信息(字段)以及来自哪些表

维度: 

日期(dt)>>DWB_ORDER_DETAIL1

城市(city_id, city_name) >>DWB_SHOP_DETAIL

商圈(trade_area_id, trade_area_name)>>DWB_SHOP_DETAIL

店铺(id, store_name)>>DWB_SHOP_DETAIL

品牌(brand_id, brand_name)>>dwb_goods_detail

大类(max_class_id, max_class_name)>>dwb_goods_detail

中类(mid_class_id, mid_class_name)>> dwb_goods_detail

小类(min_class_id, min_class_name) >>dwb_goods_detail

指标

订单量(order_id)>>DWB_ORDER_DETAIL1

金额(order_amount, goods_price, plat_fee, settlement_amount, dispatcher_money, order_from, evaluation_state, geval_scores, is_delivery, refund_id)>>DWB_ORDER_DETAIL1

维度/指标的数据来源于3张表, 且订单表(DWB_ORDER_DETAIL1)最多>>表连接时把订单表作为主表

使用with  as 做一个公共表达式先把指标/维度相关的字段数据抽取出来>>再用select 语句对数据进行分组汇总>>插入数据

抽取数据注意: 订单表的重复数据>>去重>>ROW_NUMBER()

重复数据原因:  

订单表是一个宽表, 由多张事实表连接到一起, 容易产生重复数据

比如一张订单里面有多家商铺的商品,那么就会产生多条同样的订单号

select 语句的字段及数据类型, 注意和目标表的字段相对应

目标表

目标表的group_type字段,用case when 实现

字段信息:   group_type    string COMMENT '分组类型:store,trade_area,city,brand,
min_class,mid_class,max_class,all',

注意: '分组类型'字段在用case when进行条件判断时, 只有false不满足条件才进行下一步判断>>先判断小维度,再到大维度>>减少sql 量

比如: 在维度中, 店铺 < 商圈 < 城市 ;  小类 < 中类 < 大类  ;    

目标表的指标字段

select 语句中的指标数据汇总实现

(目标表)收入/成交额>>sum() 汇总

(目标表)单量>>count() 汇总

注意: case when 去重/过滤条件

目标表的分区字段  dt >>T.dt

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

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

相关文章

网工项目实践2.8 IPv6设计及网络优化需求分析及方案制定

本专栏持续更新&#xff0c;整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.IPV6部署规划 在北京总部&#xff0c;为了迎接未来网络的发展&#xff0c;规划在BJ_G2、BJ_G3、BJ_C1、BJ_C2之间运行IPv6协议&#xff0c;以建立I…

50页PDF|数字化转型成熟度模型与评估(附下载)

一、前言 这份报告依据GBT 43439-2023标准&#xff0c;详细介绍了数字化转型的成熟度模型和评估方法。报告将成熟度分为五个等级&#xff0c;从一级的基础转型意识&#xff0c;到五级的基于数据的生态价值构建与创新&#xff0c;涵盖了组织、技术、数据、资源、数字化运营等多…

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代&#xff0c;AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型&#xff0c;凭借其出色的性能和开源免费的优势&#xff0c;成为许多开发者的首选。今天&#xff0c;就让我们一起探索如何将DeepSeek接入PyCharm&#xff0c;实现高效、智…

阐解WiFi信号强度

WiFi信号强度是指无线网络信号的强度&#xff0c;通常以负数dB&#xff08;分贝&#xff09;来表示。信号越强&#xff0c;dB值越接近零。WiFi信号强度直接影响你的网络速度、稳定性和连接的可靠性。简单来说&#xff0c;WiFi信号越强&#xff0c;你的设备与路由器之间的数据传…

MySQL数据类型

目录 1、数据类型分类 2、数值类型 2.1.tinyint类型 2.2.bit类型 2.3.小数类型 2.3.1.float 2.3.2.decimal 3.字符串类型 3.1.char 3.2.varchar 3.3 char和varchar比较 4.日期和时间类型 5.enum和set 语法&#xff1a; 案例&#xff1a; 1、数据类型分类 2、数值…

【Spring+MyBatis】_图书管理系统(下篇)

图书管理系统上篇、中篇如下&#xff1a; 【SpringMyBatis】_图书管理系统&#xff08;上篇&#xff09;-CSDN博客 【SpringMyBatis】_图书管理系统&#xff08;中篇&#xff09;-CSDN博客 目录 功能5&#xff1a;删除图书 6.1 约定前后端交互接口 6.2 后端接口 6.3 前端…

两个实用且热门的 Python 爬虫案例,结合动态/静态网页抓取和反爬策略,附带详细代码和实现说明

在这个瞬息万变的世界里&#xff0c;保持一颗探索的心&#xff0c;永远怀揣梦想前行。即使有时会迷失方向&#xff0c;也不要忘记内心深处那盏指引你前进的明灯。它代表着你的希望、你的信念以及对未来的无限憧憬。每一个不曾起舞的日子&#xff0c;都是对生命的辜负&#xff1…

鸿蒙NEXT开发-网络管理

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 网络管理-应用权限 1.1 概述 1.2 配…

基于springboot 的旧物置换网站

研究背景 近年来&#xff0c;随着网络技术的不断发展&#xff0c;越来越多人喜欢在网络上查找信息&#xff0c;将自己喜欢的信息收藏&#xff0c;方便自己进行查看。旧物置换网站对用户、卖家和管理员都有很大帮助&#xff0c;旧物置换网站通过和数据库管理系软件协作来实现用…

机器学习实战(1): 入门——什么是机器学习

机器学习入门——什么是机器学习&#xff1f; 欢迎来到“机器学习实战”系列的第一篇博文&#xff01;在这一集中&#xff0c;我们将带你了解机器学习的基本概念、主要类型以及它在现实生活中的应用。无论你是初学者还是有一定经验的开发者&#xff0c;这篇文章都会为你打下坚…

华为IPD简介

创作灵感 现在“熟悉华为IPD”经常出现在高级招聘岗位能力要求上&#xff0c;于是作者写下此文章以此巩固相关知识储备 名词解释 华为IPD&#xff08;Integrated Product Development&#xff0c;集成产品开发&#xff09;是华为引入并优化的一套产品开发管理体系&#xff0…

Git备忘录(三)

设置用户信息: git config --global user.name “itcast” git config --global user.email “ helloitcast.cn” 查看配置信息 git config --global user.name git config --global user.email $ git init $ git remote add origin gitgitee.com:XXX/avas.git $ git pull or…

智能体(AI Agent、Deepseek、硅基流动)落地实践Demo——借助大模型生成报表,推动AI赋能企业决策

文章目录 一、 引言二、 系统设计与技术细节2.1 系统架构2.2 核心组件说明 三、 Demo 代码推荐博客&#xff1a; 四、输出年度营销报告1. 总销售额 根据提供的数据&#xff0c;年度总销售额为&#xff1a;740.0。2. 各产品销售额3. 各地区销售额4. 各产品在各地区的销售情况 分…

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】&#xff1a; 本文分析【Detecting Binocular Half-Occlusions&#xff1a;Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上&#xff0c;这是1篇中…

检测网络安全漏洞 工具

实验一的名称为信息收集和漏洞扫描 实验环境&#xff1a;VMware下的kali linux2021和Windows7 32&#xff0c;网络设置均为NAT&#xff0c;这样子两台机器就在一个网络下。攻击的机器为kali,被攻击的机器为Windows 7。 理论知识记录&#xff1a; 1.信息收集的步骤 2.ping命令…

PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

Nacos学习(一)——基本介绍、安装与负载均衡策略

目录 一、Nacos基本介绍 二、安装与使用 (一)Nacos安装 1.上传到linux上解压 2.按需修改配置文件 3.单机启动 4.查看Nacos启动日志 5.浏览器访问Nacos服务 6.关闭Nacos服务 (二)Nacos使用 1.新建一个项目 2.最外部依赖如下 3.provider-service包的依赖 4.配置文件…

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…

JVM 类加载器深度解析(含实战案例)

上期文章内容&#xff1a;JVM类加载过程详解&#xff1a;从字节码到内存的蜕变之旅 目录 一、类加载器的本质是什么&#xff1f; 二、类加载机制全景 1.1 三阶段生命周期 1.2 关键数据结构 三、类加载器体系架构 2.1 四层标准类加载器 2.2 类加载器树形结构 四、双亲委派…

仿 Sora 之形,借物理模拟之技绘视频之彩

来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer&#xff08;以下简称“PD”&#xff09;。PD与OpenAI旗下的Sora相似&#xff0c;能够借助物理模拟技术来生成视频&#xff0c;这意味着PD所生成的视频蕴…