Hive电商用户画像
Hive电商用户画像
- 1、用户画像
- 1.1 用户消费订单表
- 1.1.1 近30天订单
- 1.1.2 退货和拒收
- 1.1.3 常用收货地址、常用支付方式
- 1.1.4 剩余指标计算
- 1.2 用户营销信息表
- 1.2.1 Spark SQL 计算30天内用户的活跃状态
- 1.2.2 Spark ML 构建用户价值模型
- 1.2.2.1 RFM模型
- 1.2.2.2 K-Means算法
- 2、Spark SQL 平台指标统计
- 2.1 统计用户信息(如 性别、地域、年龄段等)的分布情况
- 2.2 统计平台近期新增注册人数、每日的总订单量以及订单流水金额等
- 2.3 统计活动前后平台注册量、订单量、订单总金额的周环比
- 2.4 统计优惠券即将过期时间,供短信营销服务进行对持券用户的消费唤醒
1、用户画像
1.1 用户消费订单表
字段 | 类型 | 描述 |
---|---|---|
user_id | bigint | 用户ID |
first_order_time | timestamp | 第一次消费时间 |
last_order_time | timestamp | 最近一次消费时间 |
first_order_ago | bigint | 首单距今时间 |
last_order_ago | bigint | 尾单距今时间 |
month1_hg_order_cnt | bigint | 近30天购买次数(不含退拒) |
month1_hg_order_amt | double | 近30天购买金额(不含退拒) |
month1_order_cnt | bigint | 近30天购买次数(含退拒) |
month1_order_amt | double | 近30天购买金额(含退拒) |
max_order_amt | double | 最大消费金额 |
min_order_amt | double | 最小消费金额 |
total_order_cnt | bigint | 累计消费次数(不含退拒) |
total_order_amt | double | 累计消费金额(不含退拒) |
total_coupon_amt | double | 累计使用代金券金额 |
user_avg_amt | double | 客单价(含退拒) |
month1_user_avg_amt | double | 近30天客单价(含退拒) |
common_address | string | 常用收货地址 |
common_paytype | string | 常用支付方式 |
month1_cart_cnt | bigint | 最近30天购物车次数 |
month1_cart_goods_cnt | bigint | 最近30天购物车商品件数 |
month1_cart_submit_cnt | bigint | 最近30天购物车提交商品件数 |
month1_cart_rate | double | 最近30天购物车成功率 |
month1_cart_cancel_cnt | bigint | 最近30天购物车取消商品件数 |
return_cnt | bigint | 退货商品数量 |
return_amt | double | 退货商品金额 |
reject_cnt | bigint | 拒收商品数量 |
reject_amt | double | 拒收商品金额 |
last_return_time | timestap | 最后一次退货时间 |
school_order_cnt | bigint | 学校下单次数 |
company_order_cnt | bigint | 公司下单次数 |
home_order_cnt | bigint | 在家下单次数 |
forenoon_order_cnt | bigint | 上午下单次数 |
afternoon_order_cnt | bigint | 下午下单次数 |
night_order_cnt | bigint | 晚上下单次数 |
morning_order_cnt | bigint | 凌晨下单次数 |
1.1.1 近30天订单
(casewhen order_date >= data_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'), 29) and order_date<=from_unixtime(unix_timestamp(),'yyyy-MM-dd') then 1
end) dat_30
1.1.2 退货和拒收
(casewhen order_status in (3,4) then1 else 0
end) jt_flag
1.1.3 常用收货地址、常用支付方式
select
user_id,addr
from(
select
user_id,addr,row_number() over(partition by user_id order by addr_cnt desc) as rn
from(
select
user_id,
concat(nvl(area_name,''),nvl(area_name,'')) as addr,
count(1) as addr_cnt
from dm_ord_order
group by user_id, concat(nvl(area_name,''),nvl(area_name,''))
) o1
) o2
where rn = 1
1.1.4 剩余指标计算
select t.user_id, -- 客户ID
min(create_time) first_order_time, -- 第一次消费时间
max(create_time) last_order_time, -- 最近一次消费时间
datediff(min(create_time),from_unixtime(unix_timestamp(),'yyyy-MM-dd')) first_order_ago, -- 首单距今时间
datediff(max(create_time),from_unixtime(unix_timestamp(),'yyyy-MM-dd')) last_order_ago, -- 尾单距今时间
sum(case when t.dat_30 = 1 and t.jt_flag=0 then 1 end) month1_hg_order_cnt, -- 近30天购物件数(不含退拒)
sum(case when t.dat_30 = 1 and t.jt_flag=0 then t.order_money end) month1_hg_order_amt, -- 近30天购物金额(不含退拒)
sum(dat_30) month1_order_cnt, -- 近30天购物件数(含退拒)
sum(case when t.dat_30 = 1 then t.order_money end) month1_hg_order_amt, -- 近30天购物金额(含退拒)
max(t.order_money) max_order_amt, -- 最大消费金额
min(t.order_money) min_order_amt, -- 最小消费金额
sum(case when t.jt_flag = 0 then 1 end) total_order_cnt, -- 累计消费次数(不含退拒)
sum(case when t.jt_flag = 0 then t.order_money end) total_order_amt, -- 累计消费金额(不含退拒)
sum(coupon_money) total_coupon_amt, -- 累计使用代金券金额
sum(t.order_money)/count(1) user_avg_amt, -- 客单价(含退拒)
sum(case when t.order_status = 3 then t1.goods_amount end) return_cnt, -- 退货商品数量
sum(case when t.order_status = 3 then t.order_money end) return_amt, -- 退货商品金额
sum(case when t.order_status = 4 then t1.goods_amount end) reject_cnt, -- 拒收商品数量
sum(case when t.order_status = 4 then t.order_money end) reject_amt, -- 拒收商品金额
max(case when t.order_status = 3 then t.create_time end) last_teturn_time, -- 最近一次退货时间
sum(case when t.order_addr = 1 then 1 end) school_order_cnt, -- 学校下单总数
sum(case when t.order_addr = 2 then 1 end) company_order_cnt, -- 公司下单总数
sum(case when t.order_addr = 3 then 1 end) home_order_cnt, -- 在家下单总数
sum(case when t.order_hour >= 8 and t.order_hour <= 11 then 1 end) forenoon_order_cnt, -- 上午下单总数
sum(case when t.order_hour >= 12 and t.order_hour <= 18 then 1 end) afternoon_order_cnt, -- 下午下单总数
sum(case when t.order_hour >= 19 and t.order_hour <= 22 then 1 end) night_order_cnt, -- 晚上下单总数
sum(case when t.order_hour >= 23 and t.order_hour <= 7 then 1 end) morning_order_cnt, -- 凌晨下单总数
hour(create_time) order_hour
from dm_ord_order t
left join (select order_id, sum(goods_amount) goods_amount from dm_ord_order_goods)
on (t.order_id = t1.order_id)
group by t.user_id
1.2 用户营销信息表
字段 | 类型 | 描述 |
---|---|---|
user_id | bigint | 用户ID |
tag_phone | string | 营销手机号 |
monthly_activity | string | 活跃状态:注册未购买、活跃、沉睡、流失 |
user_value | string | 用户价值模型:利用RFM模型结合K-Means算法将用户分为:高价值、中价值、一般价值 |
1.2.1 Spark SQL 计算30天内用户的活跃状态
public class SparkUtils {// 定义会话池private static ThreadLocal<SparkSession> sessionPool = new ThreadLocal<>();public static SparkSession initSession() {if (sessionPool.get() != null) {return sessionPool.get();}SparkSession session = SparkSession.builder().appName("etl").master("local[*]").enableHiveSupport().getOrCreate();sessionPool.set(session);return session;}
}
public class ConversionEtl {public static void main(String[] args) {SparkSession session = SparkUtils.initSession();ConversionVo conversionVo = conversionBehaviorCount(session);System.out.println(conversionVo);}public static ConversionVo conversionBehaviorCount(SparkSession session){// 查询下过订单的用户Dataset<Row> orderMember = session.sql("select distinct(member_id) from ecommerce.t_order " +"where order_status=2");// 将购买次数超过 1 次的用户查出来Dataset<Row> orderAgainMember = session.sql("select t.member_id as member_id " +" from (select count(order_id) as orderCount," +" member_id from ecommerce.t_order " +" where order_status=2 group by member_id) as t " +" where t.orderCount>1");// 查询充值过的用户Dataset<Row> charge = session.sql("select distinct(member_id) as member_id " +"from ecommerce.t_coupon_member where coupon_channel = 1");Dataset<Row> join = charge.join(orderAgainMember,orderAgainMember.col("member_id").equalTo(charge.col("member_id")),"inner");// 统计各层级的数量long order = orderMember.count();long orderAgain = orderAgainMember.count();long chargeCoupon = join.count();// 包装成VOConversionVo vo = new ConversionVo();vo.setPresent(1000L); // 目前数据中没有,直接给定值vo.setClick(800L);vo.setAddCart(600L);vo.setOrder(order);vo.setOrderAgain(orderAgain);vo.setChargeCoupon(chargeCoupon);return vo;}@Datastatic class ConversionVo{private Long present; private Long click;private Long addCart;private Long order;private Long orderAgain;private Long chargeCoupon;}
}
1.2.2 Spark ML 构建用户价值模型
1.2.2.1 RFM模型
- 统计180天内订单总金额、购买次数以及最近一次购买日期
select
month6_hg_order_amt,--180天内订单总金额(不含退拒)
month6_hg_order_cnt,--180天内购买次数(不含退拒)
last_order_time --最近一次购买日期
from
dm_user_protrait_order_sale
1.2.2.2 K-Means算法
- 高价值用户(上一次购买时间集中在最近一个月,180天内消费次数大约为10-25次,180天内消费金额集中在1000-2000元)
- 中价值用户(上一次购买时间较久,平均分布在1个月到3个月不等,180天内消费次数大约为10次以内,180天内消费金额集中在500-1500元)
- 一般价值用户(上一次购买时间集中在最近一个月,180天内消费次数在5次以内,180天内消费金额集中在500元以内)
2、Spark SQL 平台指标统计
2.1 统计用户信息(如 性别、地域、年龄段等)的分布情况
public static List<MemberSex> memberSexEtl(SparkSession session) {// 先用sql得到每个性别的count统计数据Dataset<Row> dataset = session.sql("select sex as memberSex, count(id) as sexCount " +" from ecommerce.t_member group by sex");List<String> list = dataset.toJSON().collectAsList();// 对每一个元素依次map成MemberSex,收集起来List<MemberSex> result = list.stream().map( str -> JSON.parseObject(str, MemberSex.class)).collect(Collectors.toList());return result;
}
2.2 统计平台近期新增注册人数、每日的总订单量以及订单流水金额等
// 近七天注册人数统计
String memberSql = "select date_format(create_time,'yyyy-MM-dd') as day," +" count(id) as regCount, max(id) as memberCount " +" from ecommerce.t_member where create_time >='%s' " +" group by date_format(create_time,'yyyy-MM-dd') order by day";memberSql = String.format(memberSql, DateUtil.DateToString(sevenDayBefore, DateStyle.YYYY_MM_DD_HH_MM_SS));
Dataset<Row> memberDs = session.sql(memberSql);
2.3 统计活动前后平台注册量、订单量、订单总金额的周环比
public static List<RegVo> regWeekCount(SparkSession session) {LocalDate now = LocalDate.of(2019, Month.NOVEMBER, 30);Date nowDay = Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());Date lastTwoWeekFirstDay = DateUtil.addDay(nowDay, -14);String sql = "select date_format(create_time,'yyyy-MM-dd') as day," +" count(id) as regCount from ecommerce.t_member " +" where create_time >='%s' and create_time < '%s' " +" group by date_format(create_time,'yyyy-MM-dd')";sql = String.format(sql,DateUtil.DateToString(lastTwoWeekFirstDay, DateStyle.YYYY_MM_DD_HH_MM_SS),DateUtil.DateToString(nowDay, DateStyle.YYYY_MM_DD_HH_MM_SS));Dataset<Row> dataset = session.sql(sql);List<String> list = dataset.toJSON().collectAsList();List<RegVo> result = list.stream().map(str -> JSON.parseObject(str, RegVo.class)).collect(Collectors.toList());return result;
}
2.4 统计优惠券即将过期时间,供短信营销服务进行对持券用户的消费唤醒
public static List<CouponRemindVo> couponRemindCount(SparkSession session){LocalDate now = LocalDate.of(2019, Month.NOVEMBER, 30);Date nowDay = Date.from(now.atStartOfDay(ZoneId.systemDefault()).toInstant());Date sevenDayBefore = DateUtil.addDay(nowDay, -7);String sql ="select date_format(create_time,'yyyy-MM-dd') as day, " +" count(member_id) as couponCount " +" from ecommerce.t_coupon_member where coupon_id != 1 " +" and create_time >= '%s' " +" group by date_format(create_time,'yyyy-MM-dd')";sql = String.format(sql,DateUtil.DateToString(sevenDayBefore, DateStyle.YYYY_MM_DD_HH_MM_SS));Dataset<Row> dataset = session.sql(sql);List<String> list = dataset.toJSON().collectAsList();List<CouponRemindVo> result = list.stream().map(str -> JSON.parseObject(str, CouponRemindVo.class)).collect(Collectors.toList());return result;}
Hive电商用户画像相关推荐
- 如何构建电商用户画像
5.1 构建电商用户画像技术和流程 构建一个用户画像,包括数据源端数据收集.数据预处理.行为建模.构建用户画像 有些标签是可以直接获取到的,有些标签需要通过数据挖掘分析到! 5.2 源数据分析 用户数 ...
- 实战案例,手把手教你构建电商用户画像 | 附代码
导读:本文以真实案例,手把手教你搭建电商系统的用户画像. 先来看该电商用户画像用到的标签. 数据内容包括user_id(用户身份).item_id(商品).IDbehavior_type(用户行为类型 ...
- 大数据项目篇--电商用户画像
文章目录 第一章 项目整体介绍 1.1 数据源分析 1.2 项目架构 1.3 数据展示和应用 第二章 环境配置 第三章 数据准备 第四章 数据处理 4.1 创建项目 4.2 引入依赖和插件 4.3 创 ...
- SparkSQL电商用户画像(五)之用户画像开发(客户基本属性表)
7.1用户画像–数据开发的步骤 u 数据开发前置依赖 -需求确定 pv uv topn -建模确定表结构 create table t1(pv int,uv int,topn string) -实现方 ...
- (一)基于Flink电商用户画像项目:项目概述
文章目录 项目架构设计 静态信息 动态信息 项目架构设计 应用端: 移动端 pc端 小程序端口 快应用 处理层 1,业务数据存储在关系型数据库后落hdfs中 2.用户日志,通过不同的方式落入画像系统中 ...
- 直播报名 | 大牛教你哔哩哔哩、亚马逊跨境电商用户画像实战真经
▼ 点击阅读原文,体验 demo
- 【数据分析】电商平台入驻商用户画像分析
电商平台入驻商数据分析思路 1.1 互联网电商平台入驻商数据分析的一般思路 获得数据 :前台数据(价格.销量.关键词,需要通过爬虫获得)+后台数据(广告数据.订单数据.平台提供的接口,入驻商自用统计软 ...
- 对电商用户的数据分析!
一.以淘宝等为主的用户分析场景 以淘宝.京东和拼多多为典型的用户+商品消费场景,是国内用户量最多的业务场景,也是产生利润最多的业务场景.在这其中,客户拥有最大的自主权,如何有效地加以利用或辨别客户在行 ...
- Flink_大数据技术之电商用户行为分析
大数据技术之电商用户行为分析 第1章 项目整体介绍 1.1 电商的用户行为 电商平台中的用户行为频繁且较复杂,系统上线运行一段时间后,可以收集到大量的用户行为数据,进而利用大数据技术进行深入挖掘和分析 ...
最新文章
- 理解http响应头中的Date和Age
- python装饰器作用-Python装饰器的通俗理解
- 怎么写redmine wiki
- Redhat 或 CentOS 发行版本号
- hunnu---11547 你的组合数学学得如何?
- SpringAOP xml 方式和注解简单实现日志处理
- 命令提示符死亡之ping教程
- socket中的recv函数
- 2020 EBC徒步功课做好 好好工作心态,Android并发原理解析
- python3类c语言LL1文法编译器设计
- 微信小程序|借助和风天气开放API接口,实现天气预报
- DPCA 密度峰值聚类记录
- 九阴真经Ambari——4.创建本地仓库
- 完美生成年度节假日表,Kettle还能这么玩!
- ubuntu 添加中文拼音输入法
- 卷积神经网络 CNN 简述
- 技嘉1080显卡体质测试软件,【技嘉GTX1080评测】突破屏障 技嘉GTX 1080 G1 Gaming评测_技嘉 GTX 1080 G1 Gaming 8G_显卡评测-中关村在线...
- 【什么是渲染目标(render target)】
- Linux移动机器人硬件部分,基于ORB-SLAM的移动机器人嵌入式实现与优化
- Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作