Spark实现电商消费者画像案例

作者/朱季谦

故事得从这一张图开始说起——

可怜的打工人准备下班时,突然收到领导发来的一份电商消费者样本数据,数据内容是这样的——

消费者姓名|年龄|性别|薪资|消费偏好|消费领域|常用购物平台|常用支付方式|单次购买商品数量|优惠券获取情况|购物动机

Mario Johnston,53,男,12510,性价比,母婴用品,网易考拉,信用卡,2,折扣优惠,兴趣爱好
Daniel Cooper,28,男,11891,社交影响,图书音像,京东,信用卡,1,折扣优惠,兴趣爱好
Amber Powell,28,女,3365,环保可持续,食品饮料,苏宁易购,货到付款,1,折扣优惠,日常使用
Olivia Fletcher,32,女,3055,环保可持续,食品饮料,天猫,银联支付,7,满减优惠,日常使用
William Wood,32,男,13492,创新设计,电子产品,网易考拉,货到付款,9,有优惠券,商品推荐
Sarah Bell,36,男,17791,创新设计,家居用品,亚马逊,微信支付,1,免费赠品,商品推荐
Cynthia Grant MD,65,男,17847,品牌追求,服装,唯品会,支付宝,3,有优惠券,跟风购买
......

这份数据样本总共五千多条,打工人害怕弄丢了,他决定先上传到百度网盘,放在这个网盘地址里——

链接: 百度网盘 请输入提取码 提取码: wjgw

存好数据后,打工人去跟领导讨论一下需要分析哪些画像,领导给了一下几个思路——

年龄和性别画像:根据用户的年龄和性别信息,了解不同年龄段和性别分布情况。
购物平台和支付方式画像:了解用户首选的电商平台和支付方式,有助于针对不同渠道进行个性化的营销活动。
优惠偏好画像:通过用户在折扣优惠、免费赠品等方面的选择,可以了解其在购物时最看重哪些优惠方式。
商品类别偏好画像:根据用户对汽车配件、珠宝首饰、图书音像等不同商品类别的选择,可以推测用户的兴趣爱好和消费倾向。
购物目的画像:通过用户对商品的描述,如性价比、时尚潮流、环保可持续等,推断其购物的目的和价值观。

接下来,就是基于这些数据和分析目标,开始基于Spark实现电商用户画像案例讲解。

在线上生产环境里,样本数据一般会放到HDFS或者HBase等地方,这些数据可能还会进一步清洗后同步到Hive里,方便直接Hive SQL或者Spark-SQL方式读取到做计算。本次代码案例里,暂时不需要涉及那么复杂的存储,只需了解真实生产线上数据是放HDFS、HBase等仓库存储即可。

一、本地样本文件的存放和读取清洗

把样本文件consumers.csv放到项目里路径为src/main/resources/consumers.csv,通过Spark读取到内存当中,顺便打印看下读取到的数据情况——

def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local").setAppName("consumer")val ss = SparkSession.builder().config(conf).getOrCreate()val filePath: String = "src/main/resources/consumers.csv"val fileRDD = ss.sparkContext.textFile(filePath)
}

打印的结果如下所示——

Gary Mcpherson,37,女,11936,个性定制,食品饮料,京东,支付宝,4,折扣优惠,兴趣爱好
Molly Stone,31,女,14962,时尚潮流,汽车配件,拼多多,微信支付,3,无优惠券,商品推荐
Amy Wright,65,女,12855,时尚潮流,运动健身,唯品会,信用卡,3,满减优惠,日常使用
Anna Christensen,35,男,8201,创新设计,图书音像,亚马逊,货到付款,3,满减优惠,跟风购买
Samuel Santana,23,男,5061,创新设计,汽车配件,京东,支付宝,10,折扣优惠,跟风购买
Robert Williams,25,女,3038,环保可持续,食品饮料,网易考拉,支付宝,6,有优惠券,日常使用
Christopher Brown,40,女,9087,社交影响,服装,天猫,货到付款,5,折扣优惠,跟风购买
Dale Vazquez,40,女,14648,社交影响,食品饮料,亚马逊,信用卡,2,满减优惠,兴趣爱好
......

可见,Spark读取到内存里的数据,还是原始数据格式,我们需要对其进行切割,最简单的方式,就是通过Spark的map算子,将每一行的字符串,切割后存入到数组结构里,转换的情况如下图所示——

只需要一行代码就可以实现将原始样本每一行字符数据转成数组结构——

val consumerRDD = fileRDD.map(_.split(","))

转换生成的consumerRDD里每一行数据,可以理解成是一个数组,数组索引0~10对应的字段类型如下——

原始样本处理成上图情况,后续的操作,其实就纯粹可以通过类似SQL形式来计算需要的结果了。

二、画像数据分析的实现

2.1、商品类别偏好画像

根据用户对汽车配件、珠宝首饰、图书音像等不同商品类别的选择,可以推测用户的兴趣爱好和消费倾向。

针对这个需求,可以通过以下代码实现——

def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local").setAppName("consumer")val ss = SparkSession.builder().config(conf).getOrCreate()val filePath: String = "src/main/resources/consumers.csv"val fileRDD = ss.sparkContext.textFile(filePath)val consumerRDD = fileRDD.map(_.split(","))consumerRDD.map(x => (x.apply(5), 1)).reduceByKey(_ + _).sortBy(_._2, false).foreach(println)
}

打印结果如下,可见这批样本里,受消费者消费倾向最多的前TOP3,分别是服装、家居用品、图书音像——

(服装,553)
(家居用品,542)
(图书音像,539)
(珠宝首饰,535)
(母婴用品,530)
(美妆护肤,526)
(汽车配件,523)
(电子产品,506)
(食品饮料,500)
(运动健身,492)

实现的核心是通过这行代码consumerRDD.map(x => (x.apply(5), 1)).reduceByKey(_ + ).sortBy(._2, false)。

consumerRDD.map(x => (x.apply(5), 1))中的x.apply(5)是对应【消费领域】字段,表示将consumerRDD中每行元素里的消费字段做一个映射,值设置为1,代表一个人关注的消费领域。

reduceByKey(_ + _)表示将具有相同键的键值对进行合并,将键相同的值相加,生成一个新的RDD,其中每个键关联着其对应的累加值,例如服装这个key,最后累加得到553值。

sortBy(.2, false)表示是按照累加的值大小降序排序。

结合以上函数,就可以实现将consumerRDD中的数据按照【消费领域】字段,聚合出每个领域的消费者数量。

2.2、优惠偏好画像

通过用户在折扣优惠、免费赠品、品牌忠诚等方面的选择,可以了解其在购物时最看重哪些消费习惯。

def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local").setAppName("consumer")val ss = SparkSession.builder().config(conf).getOrCreate()val filePath: String = "src/main/resources/consumers.csv"val fileRDD = ss.sparkContext.textFile(filePath)val consumerRDD = fileRDD.map(_.split(","))consumerRDD.map(x => (x.apply(10), 1)).reduceByKey(_ + _).sortBy(_._2, false).foreach(println)
}

打印结果如下,可以看到,在这批消费者样本里,基于日常使用、礼物赠送、商品推荐等消费方式受众最多,那么可以基于商品消费做进一步优化——

(日常使用,777)
(礼物赠送,773)
(商品推荐,762)
(兴趣爱好,750)
(品牌忠诚,750)
(跟风购买,724)
(促销打折,710)

2.3、优惠券获取情况和购物动机的关系

观察优惠券获取情况和购物动机之间的联系,探索消费者是否更倾向于使用优惠券进行购物

def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local").setAppName("consumer")val ss = SparkSession.builder().config(conf).getOrCreate()val filePath: String = "src/main/resources/consumers.csv"val fileRDD = ss.sparkContext.textFile(filePath)val consumerRDD = fileRDD.map(_.split(","))//以下实现将RDD转换成类似关系型数据库表的形式val rowRDD = consumerRDD.map {x => Row(x.apply(0), x.apply(1).toInt, x.apply(2), x.apply(3).toInt, x.apply(4), x.apply(5), x.apply(6), x.apply(7), x.apply(8).toInt, x.apply(9), x.apply(10))}//Row里0~10索引数据映射的字段val schema = StructType(Seq(StructField("consumerName", StringType),StructField("age", IntegerType),StructField("gender", StringType),StructField("monthlyIncome", IntegerType),StructField("consumptionPreference", StringType),StructField("consumptionArea", StringType),StructField("shoppingPlatform", StringType),StructField("paymentMethod", StringType),StructField("quantityOfItemsPurchased", IntegerType),StructField("couponAcquisitionStatus", StringType),StructField("shoppingMotivation", StringType)
​))val df = ss.createDataFrame(rowRDD, schema).toDF()//按照【优惠券获取情况】和【购物动机】分组统计val analysisResult = df.groupBy("couponAcquisitionStatus", "shoppingMotivation").agg(count("*").alias("MotivationCount")).orderBy(desc("MotivationCount"))
​analysisResult.show()
}

打印结果如下,可见,当商品同时做【折扣优惠】和【商品推荐】时,消费者数量是最多的,其次就是购买消费有【免费赠品】及出于【兴趣爱好】动机消费。针对这类情况,可以做进一步分析,进而调整营销策略。

+-----------------------+------------------+---------------+
|couponAcquisitionStatus|shoppingMotivation|MotivationCount|
+-----------------------+------------------+---------------+
|               折扣优惠|          商品推荐|            168|
|               免费赠品|          兴趣爱好|            167|
|               免费赠品|          礼物赠送|            166|
|               满减优惠|          日常使用|            166|
|               无优惠券|          兴趣爱好|            165|
|               免费赠品|          商品推荐|            162|
|               免费赠品|          跟风购买|            160|
|               免费赠品|          日常使用|            159|
|               折扣优惠|          跟风购买|            158|
|               有优惠券|          礼物赠送|            157|
|               免费赠品|          促销打折|            157|
|               折扣优惠|          品牌忠诚|            157|
|               无优惠券|          日常使用|            156|
|               有优惠券|          日常使用|            156|
|               满减优惠|          礼物赠送|            155|
|               有优惠券|          品牌忠诚|            154|
|               免费赠品|          品牌忠诚|            154|
|               满减优惠|          商品推荐|            154|
|               无优惠券|          跟风购买|            153|
|               折扣优惠|          礼物赠送|            151|
+-----------------------+------------------+---------------+

以上是一些简单的实现,在真实环境里,并不会这么简单,可能还会涉及一系列数据的清洗和join处理,进而通过一些模型及算法,计算出更多有价值的画像数据。

样本处理完后,原以为这个故事结束了,打工人可以下班了,没想到——

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

从另一种简单的形式理解扩散模型原理和代码实践

正文 我们先来看一个简单的case。 有一组坐落在x轴的点集,最小和最大的数值为-4和4。我用浅绿色将这些点标记,记作 X 0 X_0 X0​ X 0 ∈ { ( − 4 , 0 ) , ( − 3 , 0 ) , ( − 2 , 0 ) , ( − 1 , 0 ) , ( 0 , 0 ) , ( 1 , 0 ) , ( 2 , 0 ) , ( 3 ,…

Java面试八股之MySQL的redo log和undo log

MySQL的redo log和undo log 在MySQL的InnoDB存储引擎中,redo log和undo log是两种重要的日志,它们各自服务于不同的目的,对数据库的事务处理和恢复机制至关重要。 Redo Log(重做日志) 功能 redo log的主要作用是确…

js ES6 part1

听了介绍感觉就是把js在oop的使用 作用域 作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问, 作用域分为: 局部作用域、 全局作用域 1. 函数作用域: 在函数内部声明的…

《梦醒蝶飞:释放Excel函数与公式的力量》10.1.1函数简介

10.1.1函数简介 BIN2DEC函数是Excel中用于将二进制数转换为十进制数的函数。它在处理二进制数时非常有用,尤其是在电子工程、计算机科学等领域。 10.1.2函数语法: BIN2DEC(number) number:这是要转换的二进制数,必须是以字符串…

智慧之旅不止步!凌恩生物6月客户文章累计IF>531!

2024年6月,凌恩生物助力客户发表文章75篇,累计影响因子531.8分,其中包括Nature Microbiology、Nature Communications、Microbiome、Chemical Engineering Journal、Journal of Hazardous Materials、Water Research等期刊文章。此次收录的文…

激光干涉仪可以完成哪些测量:全面应用解析

在高端制造领域,精度是衡量产品质量的关键指标之一。激光干涉仪作为一项高精度测量技术,其应用广泛,对于提升产品制造精度具有重要意义。 线性测量:精确定位的基础 激光干涉仪采用迈克尔逊干涉原理,实现线性测量。该…

Spark SQL中的正则表达式应用

正则表达式是一种强大的文本处理工具,在Spark SQL中也得到了广泛支持。本文将介绍Spark SQL中使用正则表达式的主要方法和常见场景。 目录 1. 正则表达式函数1.1 regexp_extract1.2 regexp_replace1.3 regexp_like 2. 在WHERE子句中使用正则表达式3. 在GROUP BY中使用正则表达…

【光伏仿真系统】光伏设计的基本步骤

随着全球对可再生能源需求的不断增长,光伏发电作为一种清洁、可再生的能源形式,正日益受到重视。光伏设计是确保光伏系统高效、安全、经济运行的关键环节,它涉及从选址评估到系统安装与维护的全过程。本文将详细介绍光伏设计的基本步骤&#…

【STM32/HAL】嵌入式课程设计:简单的温室环境监测系统|DS18B20 、DHT11

前言 板子上的外设有限,加上想法也很局限,就用几个传感器实现了非常简单的监测,显示和效应也没用太复杂的效果。虽说很简单,但传感器驱动还是琢磨了不久,加上串口线坏了,调试了半天才发现不是代码错了而是…

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox,和Vmware是一样的,只是box更轻量级 1)需要注意内存选择,4G 2、启动完成后,需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具,进…

苍穹外卖--启用和禁用员工

实现 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.dto.EmployeePageQueryDTO; import com.sky.entity.Employee; import com.sky.properties.JwtPro…

Debezium报错处理系列之第114篇:No TableMapEventData has been found for table id:256.

Debezium报错处理系列之第114篇:Caused by: com.github.shyiko.mysql.binlog.event.deserialization.MissingTableMapEventException: No TableMapEventData has been found for table id:256. Usually that means that you have started reading binary log within the logic…

救生拉网的使用方法及注意事项_鼎跃安全

水域救援在夏季尤为重要,随着气温的升高,人们更倾向于参与水上活动,如游泳、划船、垂钓等,这些活动虽然带来了乐趣和清凉,但同时也增加了水域安全事故的风险。救生拉网作为水域安全的重要工具之一,其重要性…

咱迈出了模仿的第一大步!快进来看看~

微信公众号:牛奶Yoka的小屋 有任何问题。欢迎来撩~ 最近更新:2024/06/28 [大家好,我是牛奶。] 这是第一篇模仿文章。咱决定先模仿样式,从外至里,层层递进。于是找了几个大V的公众号,看来看去,发…

swing图书管理系统+源码+讲解+ 报告

本次实训要求使用Java面向对象、MySQL数据库和Swing图形组件简单实现xxxx系统的增删改查操作(比如学生信息管理系统)。 实训目标 掌握面向对象编程的基本概念:类、对象、继承、封装和多态。学习使用Java进行数据库操作。熟悉MySQL数据库的使…

Instruct-GS2GS:通过用户指令编辑 GS 三维场景

Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions Introduction: https://instruct-gs2gs.github.io/ Code: https://github.com/cvachha/instruct-gs2gs Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构,将基于 NeRF 的三维场景编辑方法迁…

VS Code配置Graphviz和DOT语言环境

目录 Graphviz介绍 下载并安装Graphviz 安装插件 效果展示 Graphviz介绍 Graphviz 是一款开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图形和网络图的方法。它在网络、生物信息学、软件工程、数据库和网页设计、机器学习以及其他技术领域的可视化界面中有着…

展开说说:Android服务之实现AIDL跨应用通信

前面几篇总结了Service的使用和源码执行流程,这里再简单分析一下如果需要Service跨进程通信该怎样做。AIDL(Android Interface Definition Language)Android接口定义语言,用于实现 Android 两个进程之间进行进程间通信&#xff08…

TensorFlow系列:第二讲:准备工作

1.创建项目,选择虚拟环境 项目结构如下: data中的数据集需要提前准备好,数据分为测试集,训练集和验证集。以下是数据集的下载平台:kaggle 2.随便选择一个和水果相关的数据集,下载到本地,导入的项…

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中,Bitmap类型和Byte[]类型之间的相互转…