Hive实战 —— 电商数据分析(全流程详解 真实数据)

在这里插入图片描述
在这里插入图片描述

目录

  • 前言
  • 需求概述
  • 数据清洗
  • 数据分析
  • 一、前期准备
  • 二、项目
      • 1. 数据准备和了解
      • 2.确定数据粒度和有效列
      • 3.HDFS创建用于上传数据的目录
      • 4.建库
            • 数仓分层
      • 5.建表
        • 5.1近源层建表
        • 5.2. 明细层建表
            • 为什么要构建时间维度表?
            • 如何构建时间维度表?
        • 5.3 轻聚层建表
        • 6. 指标数据分析
            • 7.1 计算每月总收入
            • 7.2 计算每个季度的总收入
            • 7.3 按年计算总收入
            • 7.4 按工作日计算总收入
            • 7.5 按时间段计算总收入
            • 7.6 按时间段计算平均消费
            • 7.7 按工作日计算平均消费
            • 7.8 计算年、月、日的交易总数
            • 7.9 找出交易量最大的10个客户
            • 7.10找出消费最多的前10位顾客
            • 7.11 统计该期间交易数量最少的用户
            • 7.12 计算每个季度的独立客户总数
            • 7.13 计算每周的独立客户总数
            • 7.14 计算整个活动客户平均花费的最大值
            • 7.15 统计每月花费最多的客户
            • 7.16 统计每月访问次数最多的客户
            • 7.17 按总价找出最受欢迎的5种产品
            • 7.18 根据购买频率找出最畅销的5种产品
            • 7.19 根据客户数量找出最受欢迎的5种产品
            • 8.1 按客流量找出最受欢迎的商店
            • 8.2 根据顾客消费价格找出最受欢迎的商店
            • 8.3 根据顾客交易情况找出最受欢迎的商店
            • 8.4 根据商店和唯一的顾客id获取最受欢迎的产品
            • 8.5缺失指标,不写
            • 8.6 按年和月计算每家店的收入
            • 8.7 按店铺制作总收益饼图
            • 8.8 找出每个商店最繁忙的时间段(3小时)
            • 8.9 找出每家店的忠实顾客
            • 9.1 在ext_store_review中找出存在冲突的交易映射关系
            • 9.2 了解客户评价的覆盖率
            • 9.3 根据评分了解客户的分布情况(均分)
            • 9.4 根据交易了解客户的分布情况
            • 9.5 客户给出的最佳评价是否总是同一家门店

前言

该实战项目的目的在于通过基于小型数据的Hive数仓构建进行的业务分析来做到以小见大,熟悉实际生产情况下构建Hive数仓解决实际问题的场景。本文内容较多,包含了从前期准备到数据分析的方案,代码,问题,解决方法等等,分析的数据文件 和 Zeppelin中的源文件 都已放在文章顶部,请先行下载,并配置好Zeppelin Hive相关环境后再进行阅读。相信认真读完并参与你一定会有收获!

需求概述

  • 对某零售企业最近1年门店收集的数据进行数据分析
    • 潜在客户画像
    • 用户消费统计
    • 门店的资源利用率
    • 消费的特征人群定位
    • 数据的可视化展现
  • Customer表
    在这里插入图片描述
  • Transaction表
    在这里插入图片描述
  • Store表
    在这里插入图片描述
  • Review表
    在这里插入图片描述
  • 表间关系
    在这里插入图片描述

数据清洗

  • 对transaction_details中的重复数据生成新ID
  • 过滤掉store_review中没有评分的数据(保留)
  • 可以把清洗好的数据放到另一个表或者用View表示
  • 找出PII (personal information identification) 或PCI (personal confidential information) 数据进行加密或hash
  • 重新组织transaction数据按照日期YYYY-MM做分区

数据分析

  • Customer分析
    • 6.1找出顾客最常用的信用卡
    • 6.2找出客户资料中排名前五的职位名称
    • 6.3在美国女性最常用的信用卡
    • 6.4按性别和国家进行客户统计
  • Transaction分析-1
    • 7.1计算每月总收入
    • 7.2计算每个季度的总收入
    • 7.3按年计算总收入
    • 7.4按工作日计算总收入
    • 7.5按时间段计算总收入(需要清理数据)
    • 7.6按时间段计算平均消费
    • 7.7按工作日计算平均消费
    • 7.8计算年、月、日的交易总数
    • 7.9找出交易量最大的10个客户
    • 7.10找出消费最多的前10位顾客
  • Transaction分析-2
    • 7.11统计该期间交易数量最少的用户
    • 7.12计算每个季度的独立客户总数
    • 7.13计算每周的独立客户总数
    • 7.14计算整个活动客户平均花费的最大值
    • 7.15统计每月花费最多的客户
    • 7.16统计每月访问次数最多的客户
    • 7.17按总价找出最受欢迎的5种产品
    • 7.18根据购买频率找出最畅销的5种产品
    • 7.19根据客户数量找出最受欢迎的5种产品
  • Store分析
    • 8.1按客流量找出最受欢迎的商店
    • 8.2根据顾客消费价格找出最受欢迎的商店
    • 8.3根据顾客交易情况找出最受欢迎的商店
    • 8.4根据商店和唯一的顾客id获取最受欢迎的产品
    • 8.5获取每个商店的员工与顾客比
    • 8.6按年和月计算每家店的收入
    • 8.7按店铺制作总收益饼图
    • 8.8找出每个商店最繁忙的时间段(3小时)
    • 8.9找出每家店的忠实顾客
  • Review分析
    • 9.1在ext_store_review中找出存在冲突的交易映射关系
      transaction_id at store_id in transaction_details
      transaction_id at store_id in store_review
    • 9.2了解客户评价的覆盖率
    • 9.3根据评分了解客户的分布情况(均分)
    • 9.4根据交易了解客户的分布情况
    • 9.5客户给出的最佳评价是否总是同一家门店

一、前期准备

打开ZeppelinZeppelin相关安装与配置详见Zeppelin安装教程。
创建notebook:
在这里插入图片描述
此处需要自定义一个Hive编辑器,教程如下:

#web页面配置hive翻译器# 右上角anonymous => interpreter => 右上角 create => Interpreter NamehiveInterpreter groupjdbc#=> 设置propertiesdefault.driver  org.apache.hive.jdbc.HiveDriverdefault.url     jdbc:hive2://single:10000default.user    root#=> 左下角 save#web界面 create note# 以%hive开启作为第一行

使用Zeppelin的一些基础知识

1.set hive.server2.logging.operation.level=NONE;// 设置日志文件不输出
2.在paragraph首行都应该有一个类似`%hive`的语法(表示该paragraph使用了说明hive编译器)
3.对于数据量较小的情况,Zeppelin会不生成一些图像(显示为Data Avaliable),此时需要先在settings中配置后才会生成图像

二、项目

每部分都需要在Notebook下创建一个新的paragraph并重命名。
(注释的语句是需要执行的)

1. 数据准备和了解

下载绑定的电商数据资源,将其上传到虚拟机上。查看资源下的文件,整理其字段信息和行数待用,并且检查各份数据可能存在的问题,比如文件乱码,评分数据空缺等
小Tips:先行备好各表的字段信息有助于轻松构建ODS层的外部表,备好行数有助于在建表之后快速检查是否建表成功。
在这里插入图片描述

2.确定数据粒度和有效列

  • 数据表对于指标的有效列 DWD
    • Customer:credit_type,job,gender,country
    • Review&Store:store_id,review_score
    • Transaction:transaction_id,customer_id,store_id,price,product
  • 数据聚合维度和基于该维度的最小粒度 DWT
    每一行都作为一张表,行内容包括字段和聚合函数,字段即为聚合的分组字段。字段的排列需要遵循一定顺序,如果题目有确定的要求,例如按性别和国家进行客户统计,则分组字段的排序必须为gender,country。如果题目没有确定要求,通常粒度大的在前( 聚合粒度更大的字段能减少更多的数据量 ),有时如果为了保证出指标,我们可能也需要将粒度不够大的字段排前面。
    如何判断多个指标是否属于同一张表?
    如果某指标有新增维度,那么说明该指标是前一个指标范围的结束。例如:7.9指标新增了一个客户维度,因此7.1~7.8属于同一张表。
    • Transaction表
      • 指标7.1~7.8:year,season,month,day,time_range sum(price),count(transaction_id)
      • 指标7.9~7.16:season,month,week,customer_id sum,avg(count)
      • 指标7.17~7.20:
        product,customer_id,month sum,avg(count)
      • 指标8.1~8.9:
        store_id,customer_id,year,month sum,count(distinct)
        store_id,product,customer_id count(distinct)
    • Review表
      • 指标9.1~9.5:
        customer_id count(transaction_id),count(review_score),sum(price)
        需要与交易表聚合

3.HDFS创建用于上传数据的目录

近源层需要构建外部表,提前先准备好外部表数据的存放目录
在这里插入图片描述

4.建库

数仓分层的"层"本质就是数据库
在这里插入图片描述

数仓分层
ODS 近源层(`外部表`)
ODS层的表通常包括两类,一个用于存储当前需要加载的数据,一个用于存储处理完后的历史数据。(历史数据一般保存3-6个月后需要清除)
​数据经过ETL装入本层,接近源数据		​DWD 明细层(`内部表`)
​表合并(列),行不变
ODS层要尽可能地合并,去除无用字段,扩展维度入DWD层时间维度表
订单表				=> pro_dwd.order_detail_by_date
订单详情表省份表
城市表
店铺表				=> pro_dwd.order_detail_by_add_shop
订单表
订单详情表会采用`维度退化`手法:当一个维度没有数据仓库需要的任何数据时,就可以退化维度,将维度退化至事实表中,减少事实表和维表的关联。​DWT	轻聚层	
​1.实现聚合操作
​聚合操作包括对多个指标(如销售额、用户数等)在多个维度(如时间、地区、产品类别等)上进行统计汇总。
​2.提取聚合需求共性
​			
DWS 汇总层
​接近指标对应的结果数据,尽量提取出来就能用
大多都是按照主题划分的涵盖多个字段的宽表
​			
​DM 	数据集市
​涉及权限管理和权限申请,不同人看到不同权限的数据,也可以申请查看某份数据的权限。

5.建表

  • 建表过程中,由于数仓层之间的数据传递性,建表时,下一层可以直接对上一层的建表代码进行改动;下一层数据传入时的表数据字段也来源于上一层的基础上。
  • 每建一张表,都需要养成检查数据的习惯,通过select * from TABLE_NAME limit N对数据进行检查。
  • 如何理解近源层中的表为外部表,明细层中的表为内部表
    • 外部表的数据实际存储在外部系统(如HDFS)上,内部表的数据存储是由Hive管理的。
      这是因为ODS层存储的原始数据还可能被其他应用所使用,而DWD层存储的经过转换、清洗和集成的数据专属于Hive
    • 近源层的表通常存储原始数据,直接读取原始数据文件即可,适合外部表。
      明细层的表结构会经过更多加工和转换,可以创造不同的表结构来满足需求,再筛选有用数据导入,适合内部表。
5.1近源层建表

在这里插入图片描述
在这里插入图片描述
近源层的表都为外部表,结合前期的数据准备数据文件上传目录的创建创建近源层的表。

5.2. 明细层建表
  • 明细层涉及数据清洗(列裁剪,行压缩)
  • 明细层必要时构建时间维度表
  • 明细层需要尽可能地对不必要的维度进行维度合并
    • 上层的表就已经够用
  • 明细层表字段的几种情况:
    • 不新增字段,仍保留了所有原始字段,但是需要将数据的基本粒度字段前置,并将其余原始字段后置
    • 新增字段
    • 修改原始字段的数据类型
    • 合并原始字段
      在这里插入图片描述
  • 黑色框选部分为加密,对客户表需要对用户的关键信息(包括名,邮箱,住址,信用卡号)进行脱敏操作,根据信息的敏感度选取不同的脱敏方式和加密函数。例如:对邮箱,即对@前半部分的邮箱号码进行md5加密,后半部分保持原样并进行拼接。(代码只是将每种加密方式都尝试了一次,实际上更敏感的信息要用非对称加密)
  • 红色框选部分为问题解决,我们需要对language的乱码问题进行解决,先筛选出存在乱码的language,并搜索到这两种语言的正确格式,进行替换。
# 筛选出language列存在乱码的列
select language from rsda_ods.customer where language rlike '.*[^a-zA-Z ].*';

在这里插入图片描述
在这里插入图片描述

  • 新增original字段来表示review_score是否非空。
    通常为了保证数据的整体正态分布不受影响,避免可能产生的数据倾斜,我们会选择在数据清洗阶段将缺失数据替换为平均值

  • 由于平均分的结果通常是小数,如果对int类型数求平均数会导致精度缺失从而导致没有实现正态分布的目标,因此此处修改review_score的数据类型为decimal(3,2)

  • 如何解决store_id的映射错误?
    交易表中的数据才是正确的。
    关联transaction_id,并且判断store_id的映射是否相同,如果相同,取谁都行;如果不相同,只能取交易表中的标准的store_id。

  • 明细层不需要出现店铺表的原因?
    近源层的店铺表就已经很适合,无需再多加列裁剪或行筛选,并且没有数据清洗任务,因此不需要在明细层中出现。
    总结:不是所有表都必须出现在数仓的每一层,真正决定表是否在这一层的是数据的粒度。

在这里插入图片描述

  • 交易表是一张分区表(注意:要有动态分区配置)。分区字段不需要出现在表中,因此tran_year,tran_month都不需要在建表的时候出现。
  • 这里选择OpenCSVSerde是因为product列中存在形如"Soup - Campbells, Minestrone"的数据,如果直接用row format delimited fields terminated by ','会导致误解析列中多出来的,,因此需要选用OpenCSVSerde
  • 在面对复杂查询时,可以适当灵活地用一些优化配置来提升查询速度。详见我的博客Hive优化总结。
  • tran_datetran_time可以合并为一个完整的时间维度
    • tran_time存在三种数据格式:2:55,5:13 PM,10:47 AMunix_timestamp(tran_time,'hh:mm a')能够自动对AM|PM解析为24小时形式,最终再将其转化为完整的时间格式。
      在这里插入图片描述
  • 我们需要解决交易表中数据清洗的问题:给transaction_id重复的数据一个新的,未重复的transaction_id。解决思路如下:我们先以transaction_id分组对全局开一个row_number()的窗口,将rn>=2的数据(即重复数据)拿出来放在另一个表B,对表B再全局开一个row_number()的窗口,使每个重复数据都获得一个新行号all_rn,同时我们求出原始交易表中transaction_id的最大值max_id,将all_rn+max_id的值作为重复数据的新行号。
  • max_tran表中求最大值的优化上文已提过,不再赘述。
    在这里插入图片描述

在这里插入图片描述

为什么要构建时间维度表?

用交易表已有的时间维度分析,可能会有缺失的时间维度。为了保证时间维度的健全性,需要单独构建一张时间维度表。

如何构建时间维度表?
  • 查找时间维度边界

在构建时间维度表之前,需要全局查找交易表中最大和最小的时间,以确定时间维度的边界。

注意:查找最值一般通过部分聚合-全局聚合进行优化。

set mapreduce.job.reduces = 3;
with temp_tran as(select store_id,to_date(replace(tran_date,'/','-')) as tran_datefrom rsda_ods.transaction
),max_date_by_score as(select min(tran_date) as min_date,max(tran_date) as max_datefrom temp_trangroup by store_id
)
select min(min_date) as min_date,max(max_date) as max_date
from max_date_by_score;
-----------------------------------------------------------------------------------------
min_date							max_date
2018-01-01							2018-12-31

日期数据进行操作前,都需要先转化为标准日期格式:YYYY-MM-DD:
tran_date的原始格式为2018/1/31,需要先替换分隔符,再通过to_date()补上缺失的前置零

  • 编写时间维度构建脚本
#!/bin/bashstartDate=$1
endDate=$2startTime=`date -d "$startDate" +%s`
endTime=`date -d "$endDate +1 day" +%s`while((startTime<endTime));doyear=`date -d "@$startTime" +%Y`month=`date -d "@$startTime" +%m`quarter=$[(10#$month-1)/3+1]yearweek=`date -d "@$startTime" +%W`day=`date -d "@$startTime" +%d`hour=`date -d "@$startTime" +%H`echo "$year,$quarter,$month,$yearweek,$day,$hour" >> dim_date.csvstartDate=`date -d "@$startTime" +"%F %T"`startTime=`date -d "$startDate 1 hour" +%s`
done
  • 调用脚本(传入时间维度的开始边界结束边界)
chmod u+x dim_date_create.sh
./dim_date_create.sh 2018-01-01 2018-12-31
  • 将写入时间维度的文件传到HDFS的指定目录下,作为时间维度表的数据文件
hdfs dfs -put dim_date.csv /rsda/dim_date
5.3 轻聚层建表
  • 进行不同维度的聚合,需要参照提前第2部分数据基本粒度和有效列进行轻聚层的建表
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这张表涉及到分析9.5指标中的最佳评价如何定义的问题。
    如果最佳评价指的是用户所给的最高评分,那么如果一个用户始终打出低分,那么也不符合最佳的定义,这就是业务的矛盾点,面对业务的矛盾点,我们通常需要与客户经理对接去定义出更加复杂的指标来解决这类问题。如题目中定义出了4分的评价数5分的评价数的两个指标来作为最佳评价的指标(不设置为>=4分的评价数是对于没有5分评价的情况下便于拆分)。
    同时我们也需要考虑到数据是否存在偶然性,即如果顾客的交易数、参评数、参评率、好评数、好评率太低是不能够作为指标去进行数据分析的。
6. 指标数据分析
7.1 计算每月总收入
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=3;
select tran_month,sum(sum_amount) as sum_amount
from rsda_dws.transaction_dim_date
group by tran_month;
7.2 计算每个季度的总收入
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
select tran_season,sum(sum_amount) as sum_amount
from rsda_dws.transaction_dim_date
group by tran_season;
7.3 按年计算总收入
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
selectsum(sum_amount)
from(select sum(sum_amount) as sum_amountfrom rsda_dws.transaction_dim_dategroup by tran_season
)A;
7.4 按工作日计算总收入
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
select sum(sum_amount) as sum_amount
from(select sum(sum_amount) as sum_amountfrom rsda_dws.transaction_dim_datewhere dayofweek(concat(tran_year,'-',tran_month,'-',tran_day))<6group by tran_season
)A;

此处不能用concat_ws的原因是concat_ws的参数必须是string or array<string>,int类型数不能作为concat_ws的参数。

7.5 按时间段计算总收入
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
select floor((tran_hour/3)+1) as time_range,sum(sum_amount) as sum_amount
from rsda_dws.transaction_dim_date
group by floor((tran_hour/3)+1);

此处以3个小时为一个时段

7.6 按时间段计算平均消费
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
select floor((tran_hour/3)+1) as time_range,cast(sum(sum_amount)/sum(count_tran) as decimal(10,2)) as avg_amount
from rsda_dws.transaction_dim_date
group by floor((tran_hour/3)+1);
7.7 按工作日计算平均消费
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
selectcast(sum(sum_amount)/sum(count_tran) as decimal(10,2)) as avg_amount
from(select sum(sum_amount) as sum_amount,sum(count_tran) as count_tranfrom rsda_dws.transaction_dim_datewhere dayofweek(concat(tran_year,'-',tran_month,'-',tran_day))<6group by tran_season
)A;
7.8 计算年、月、日的交易总数
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
selecttran_year,tran_month,tran_day,sum(count_tran) as tran_count
from rsda_dws.transaction_dim_date
group by tran_year,tran_month,tran_day;
7.9 找出交易量最大的10个客户
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
with customer_count_tran as(select customer_id,sum(count_tran) as count_tranfrom rsda_dws.tran_dim_date_customergroup by customer_id
),customer_count_tran_rank as(select customer_id,count_tran,dense_rank() over(order by count_tran desc) as rnkfrom customer_count_tran
)
select customer_id,count_tran,rnk
from customer_count_tran_rank
where rnk<=10;
7.10找出消费最多的前10位顾客
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
with customer_sum_amount as(select customer_id,sum(sum_amount) as count_tranfrom rsda_dws.tran_dim_date_customergroup by customer_id
),customer_sum_amount_rank as(select customer_id,sum_amount,dense_rank() over(order by sum_amount desc) as rnkfrom customer_sum_amount
)
select customer_id,sum_amount,rnk
from customer_sum_amount_rank
where rnk<=10;
7.11 统计该期间交易数量最少的用户
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
with customer_sum_amount as(select customer_id,sum(sum_amount) as sum_amountfrom rsda_dws.tran_dim_date_customergroup by customer_id
)
select customer_id,sum_amount
from customer_sum_amount
where sum_amount = (select min(sum_amount) as sum_amountfrom customer_sum_amount
);
7.12 计算每个季度的独立客户总数
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
SELECT tran_year, tran_season, COUNT(*) AS unique_customers
FROM (SELECT tran_year, tran_season, customer_idFROM rsda_dws.tran_dim_date_customerGROUP BY tran_year, tran_season, customer_id
) AS temp
GROUP BY tran_year, tran_season
ORDER BY tran_year, tran_season;
7.13 计算每周的独立客户总数
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
SELECT tran_year_week, COUNT(*) AS unique_customers
FROM (SELECT tran_year_week, customer_idFROM rsda_dws.tran_dim_date_customerGROUP BY tran_year_week, customer_id
) AS temp
GROUP BY tran_year_week
ORDER BY tran_year_week;
7.14 计算整个活动客户平均花费的最大值
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
with customer_sum_amount_count_tran as(select customer_id,sum(sum_amount) as sum_amount,sum(count_tran) as count_tranfrom rsda_dws.tran_dim_date_customergroup by customer_id
),customer_avg_amount as(select customer_id,cast(sum_amount/count_tran as decimal(10,2)) as avg_amountfrom customer_sum_amount_count_trangroup by customer_id
)
select max(avg_amount) as max_amount
from customer_avg_amount;
7.15 统计每月花费最多的客户
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
WITH MonthlySpending AS (SELECT tran_month, customer_id, SUM(sum_amount) AS total_spending,DENSE_RANK() OVER (PARTITION BY tran_month ORDER BY SUM(sum_amount) DESC) AS rankFROM rsda_dws.tran_dim_date_customerGROUP BY tran_month, customer_id
)
SELECT tran_month, customer_id, total_spending
FROM MonthlySpending
WHERE rank = 1;
7.16 统计每月访问次数最多的客户
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
WITH MonthlyVisits AS (SELECT tran_month, customer_id, SUM(count_tran) AS total_visits,DENSE_RANK() OVER (PARTITION BY tran_month ORDER BY SUM(count_tran) DESC) AS rankFROM rsda_dws.tran_dim_date_customerGROUP BY tran_month, customer_id
)
SELECT tran_month, customer_id, total_visits
FROM MonthlyVisits
WHERE rank = 1;
7.17 按总价找出最受欢迎的5种产品
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
SELECT product, SUM(sum_amount) AS total_sales_amount
FROM rsda_dws.tran_product_customer_month
GROUP BY product
ORDER BY total_sales_amount DESC
LIMIT 5;
7.18 根据购买频率找出最畅销的5种产品
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
SELECT product, SUM(count_tran) AS total_transactions
FROM rsda_dws.tran_product_customer_month
GROUP BY product
ORDER BY total_transactions DESC
LIMIT 5;
7.19 根据客户数量找出最受欢迎的5种产品
set hive.server2.logging.operation.level=NONE;
set mapreduce.job.reduces=4;
SELECT product,count(customer_id) AS customer_count
FROM rsda_dws.tran_product_customer_month
GROUP BY product
ORDER BY total_transactions DESC
LIMIT 5;
8.1 按客流量找出最受欢迎的商店
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;select store_id,count(customer_id) as customer_count
from rsda_dws.tran_store_customer_year_month
group by store_id
order by customer_count desc
limit 1;
8.2 根据顾客消费价格找出最受欢迎的商店
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;SELECT store_id, SUM(sum_amount) AS total_spending
FROM rsda_dws.tran_store_customer_year_month
GROUP BY store_id
ORDER BY total_spending DESC
LIMIT 1;
8.3 根据顾客交易情况找出最受欢迎的商店
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;SELECT store_id, SUM(count_tran) AS total_transactions
FROM rsda_dws.tran_store_customer_year_month
GROUP BY store_id
ORDER BY total_transactions DESC
LIMIT 1;
8.4 根据商店和唯一的顾客id获取最受欢迎的产品
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;SELECT store_id,customer_id, product, MAX(sum_amount) as max_spent
FROM (SELECT store_id, customer_id, product, SUM(sum_amount) as sum_amountFROM rsda_dws.tran_store_product_customerGROUP BY store_id, customer_id, product
) AS customer_product_sales
GROUP BY store_id, customer_id;
8.5缺失指标,不写
8.6 按年和月计算每家店的收入
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;SELECT store_id, tran_year, tran_month, SUM(sum_amount) AS monthly_revenue
FROM rsda_dws.tran_store_customer_year_month
GROUP BY store_id, tran_year, tran_month;
8.7 按店铺制作总收益饼图
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;SELECT store_id, SUM(sum_amount) AS total_revenue
FROM rsda_dws.tran_store_customer_year_month
GROUP BY store_id;
8.8 找出每个商店最繁忙的时间段(3小时)

缺失指标,不写。

8.9 找出每家店的忠实顾客

我将忠实顾客定义为在这一年至少访问商店10次的顾客。

SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT customer_id, COUNT(*) AS months_visited
FROM rsda_dws.tran_store_customer_year_month
GROUP BY customer_id
HAVING months_visited >= 10;
9.1 在ext_store_review中找出存在冲突的交易映射关系

定义冲突的映射关系:一个交易ID在store_review中对应多个不同的store_id

SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT transaction_id 
FROM ext_store_review 
GROUP BY transaction_id 
HAVING COUNT(store_id) > 1;
9.2 了解客户评价的覆盖率

定义覆盖率:客户提交评价的交易数与总交易数的比例。

SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT store_id, customer_id, (review_tran_count / total_tran_count) * 100 AS review_coverage 
FROM rsda_dws.store_review_customer;
9.3 根据评分了解客户的分布情况(均分)

定义:通过评分的均分了解客户在各评分段的分布情况

SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT average_score, COUNT(*) AS customer_count 
FROM (SELECT customer_id, (sum_review / review_tran_count) AS average_score FROM rsda_dws.store_review_customer WHERE review_tran_count > 0) AS customer_scores 
GROUP BY average_score;
9.4 根据交易了解客户的分布情况
SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT total_tran_count, COUNT(*) AS customer_count 
FROM rsda_dws.store_review_customer 
GROUP BY total_tran_count;
9.5 客户给出的最佳评价是否总是同一家门店

题目转化:筛选出最佳评价不总是同一家门店的客户ID

SET hive.server2.logging.operation.level=NONE;
SET mapreduce.job.reduces=4;
SELECT customer_id 
FROM rsda_dws.store_review_customer 
WHERE four_count > 0 OR five_count > 0 
GROUP BY customer_id, store_id 
HAVING COUNT(customer_id) > 1;

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

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

相关文章

前端工程化之:webpack1-6(编译过程)

一、webpack编译过程 webpack 的作用是将源代码编译&#xff08;构建、打包&#xff09;成最终代码。 整个过程大致分为三个步骤&#xff1a; 初始化编译输出 1.初始化 初始化时我们运行的命令 webpack 为核心包&#xff0c; webpack-cli 提供了 webpack 命令&#xff0c;通过…

数学经典教材有哪些

说实话&#xff0c;国内大学教材编写的初衷&#xff0c;就是让学生自己看不懂。。 不信你去看看同济大学出版社的高数书籍。 给大家推荐两本国外的数学书&#xff0c;质量吊打国内大部分教材&#xff08;特别是同济的高数教材&#xff09;。如果我大学能看到这些教材&#xf…

android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

一、Camera 1.1、结合SurfaceView实现预览 1.1.1、布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-au…

PuLP库-多数线性规划问题

投标价格重预算 背景 甲方需要采购一批物资&#xff0c;采购数量为甲方给定的预计采购数量&#xff0c;并限制了采购总价。例甲方采购预算清单如下&#xff0c;采购总预算为不超过 3175 元 采购内容采购数量投标单价投标报价合计电脑10空调20洗衣机8桌子7打印机35合计 注&a…

正则匹配 | 正则实际应用探索分享

这并不是一篇教正则基础的文章&#xff0c;其正则式不能对您进行使用后的结果负责&#xff0c;请以研究的眼光看待本篇文章。 技术就是懒人为了更好的懒才会想办法搞的东西&#xff0c;我最近因为某些原因需要频繁删除注释 我就想到通过替换的正则功能快速删除文件中的简单注…

IP报文格式

IP报文格式 报文格式 图1 IP头格式 表1 IP头字段解释 字段长度含义Version4比特 4&#xff1a;表示为IPV4&#xff1b;6&#xff1a;表示为IPV6。IHL4比特首部长度&#xff0c;如果不带Option字段&#xff0c;则为20&#xff0c;最长为60&#xff0c;该值限制了记录路由选项。…

Java / Spring Boot + POI 给 Word 添加水印

1、前言(瞎扯) 有个需求&#xff1a;整一个给 Word 加水印的demo&#xff0c;于是我就网上找呗~ 看到那个 Aspose 好像是收费的&#xff0c;然后就把目光转向了 POI&#xff0c;看到各种形形色色的也不知道哪个能用。整了一会&#xff0c;自己拷贝出一个比较精简的能用的 demo …

SpringBoot activemq收发消息、配置及原理

SpringBoot集成消息处理框架 Spring framework提供了对JMS和AMQP消息框架的无缝集成&#xff0c;为Spring项目使用消息处理框架提供了极大的便利。 与Spring framework相比&#xff0c;Spring Boot更近了一步&#xff0c;通过auto-configuration机制实现了对jms及amqp主流框架…

首发:2024全球DAO组织发展研究

作者&#xff0c;张群&#xff08;专注DAO及区块链应用研究&#xff0c;赛联区块链教育首席讲师&#xff0c;工信部赛迪特邀资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09; DAO&#xff08;去中心化自治组织&am…

03-Redis缓存高可用集群

文章目录 1、Redis集群方案比较2、Redis高可用集群搭建redis集群搭建Java操作redis集群 4、Redis集群原理分析槽位定位算法跳转重定位Redis集群节点间的通信机制gossip通信的10000端口网络抖动 Redis集群选举原理分析集群脑裂数据丢失问题集群是否完整才能对外提供服务Redis集群…

LC 2846. 边权重均等查询

2846. 边权重均等查询 难度&#xff1a; 困难 题目大意&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 …

Android studio环境搭建过程异常

异常1 e: file:///D:/project/AndroidProject/settings.gradle.kts:5:21: Unexpected tokens (use ; to separate expressions on the same line) dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories { // …

第16章_网络编程(网络通信要素,TCP与UDP协议,网络编程API,TCP网络编程,UDP网络编程,URL编程)

文章目录 第16章_网络编程本章专题与脉络1. 网络编程概述1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一&#xff1a;IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二&#xff1a;端口号2.4 通信要素三&#xff1a;网络通信协议…

BLIP-2: 基于冻结图像编码器和大型语言模型的语言-图像预训练引导

BLIP-2: 基于冻结图像编码器和大型语言模型的语言-图像预训练引导 项目地址BLIP-2的背景与意义BLIP-2的安装与演示BLIP-2模型库图像到文本生成示例特征提取示例图像-文本匹配示例性能评估与训练引用BLIP-2Hugging Face集成 在语言-图像预训练领域&#xff0c;BLIP-2的出现标志着…

深度学习分类问题之Logistic Regression

逻辑回归模型&#xff0c;虽然名字是回归&#xff0c;但是是解决分类问题。 在线性回归里面&#xff0c;我们根据有效信息&#xff0c;预测下一个由已知信息得到的数值&#xff0c;叫做回归问题&#xff0c;但是在机器学习里面&#xff0c;常见的是分类问题。最常见的就是MNIS…

React16源码: React中commitAllHostEffects内部的commitDeletion的源码实现

commitDeletion 1 &#xff09;概述 在 react commit 阶段的 commitRoot 第二个while循环中调用了 commitAllHostEffects&#xff0c;这个函数不仅仅处理了新增节点&#xff0c;更新节点最后一个操作&#xff0c;就是删除节点&#xff0c;就需要调用 commitDeletion&#xff0…

《动手学深度学习(PyTorch版)》笔记4.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

掌握可视化大屏:提升数据分析和决策能力的关键(下)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

(大众金融)SQL server面试题(3)-客户已用额度总和

今天&#xff0c;面试了一家公司&#xff0c;什么也不说先来三道面试题做做&#xff0c;第三题。 那么&#xff0c;我们就开始做题吧&#xff0c;谁叫我们是打工人呢。 题目是这样的&#xff1a; DEALER_INFO经销商授信协议号码经销商名称经销商证件号注册地址员工人数信息维…

three.js 鼠标选中模型弹出标签

效果&#xff1a;请关注抖音 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…