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://www.pswp.cn/web/42703.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42703.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42703.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS 7:停止更新后如何下載軟件?

引言 CentOS 7 是一個廣受歡迎的 Linux 發行版,它為企業和開發者提供了一個穩定、安全、且免費的操作系統環境。然而,隨著時間的推移,CentOS 7 的官方支持已經進入了維護階段,這意味著它將不再收到常規的更新和新功能,…

圖像類別生成數字標簽

類別 COCO 2017數據集分類標簽。coco2017數據集下載。 cls [background, person, bicycle, car, motorcycle, airplane, bus,train, truck, boat, traffic light, fire hydrant,stop sign, parking meter, bench, bird, cat, dog,horse, sheep, cow, elephant, bear, zebra,…

2024建博會|博聯AI大模型全屋智能引領智能體驗新紀元

7月8日,2024中國建博會(廣州)在廣交會展館及保利世貿博覽館盛大啟幕。BroadLink博聯智能攜AI大模型全屋智能以及AI商業照明解決方案驚喜亮相,全方位展示AI大模型在智能家居領域的前沿應用成果。 本次建博會,博聯智能帶…

java.lang.annotation包介紹

java.lang.annotation 包是 Java 標準庫中的一個核心包,專門用于定義和支持 Java 注解(Annotation)。該包中包含了一些核心的接口和枚舉類型,用于定義和控制注解在 Java 程序中的行為和使用方式。 主要的類和接口 Annotation 接口 java.lang.annotation.Annotation 所有注…

NPDP含金量高嗎?什么人適合學習NPDP?

PMP考完了,最近在考NPDP,這也是一個有意思的證書,含金量還不錯,非常適合想轉型和升級的人來考。 一、NPDP是什么 NPDP其實就是產品經理國際資格認證(New Product Development Professional),是…

C++慣用法: 通過std::decltype來SFINAE掉表達式

目錄 1.什么是SFINAE 2.SFINAE(替換失敗不是錯誤) 3.通過std::decltype來SFINAE掉表達式 1.什么是SFINAE SFINAE 技術,即匹配失敗不是錯誤,英文Substitution Failure Is Not An Error,其作用是當我們在進行模板特化的時候,會去…

嵌入式c語言——指針加修飾符

指針變量可以用修飾符來修飾

量化交易常用名詞介紹(七)——模塊篇

目錄 七、模塊篇 1. NumPy 2. pandas 3. matplotlib 4. scikit-learn 5. TensorFlow 6. TA-Lib 7. statsmodels 8. Backtrader 9. PyPortfolioOpt 10. Zipline 七、模塊篇 在量化交易中,Python 及其豐富的庫生態系統提供了強大的支持。以…

Redis部署和基礎命令

一、Redis基本概念 1.1 Redis簡介 Redis(遠程字典服務器) 是一個開源的、使用 C 語言編寫的 NoSQL 數據庫。 Redis 基于內存運行并支持持久化,采用key-value(鍵值對)的存儲形式,是目前分布式架構中不可或…

python爬蟲之scrapy基于管道持久化存儲操作

python爬蟲之scrapy基于管道持久化存儲操作 本文基于python爬蟲之基于終端指令的持久化存儲和python爬蟲之數據解析操作而寫 scrapy持久化存儲 基于管道: 編碼流程: 1、數據解析 2、在item類中定義相關屬性 3、將解析的數據封裝存儲到item類型的對象 4、…

Linux內核 -- 內存管理之scatterlist結構使用

Linux Kernel Scatterlist 使用指南 1. 簡介 scatterlist 結構在 Linux 內核中主要用于 DMA(直接內存訪問)操作中的內存管理。它允許將不連續的物理內存片段表示為一個邏輯上的連續塊,從而使 DMA 操作可以高效地處理這些不連續的內存片段。…

【問題記錄】VsCode中以管理員權限運行Powershell

問題展示 今天在嘗試運行nodemon命令的時候出問題,顯示沒法識別,經過分析發現是管理員權限的問題,由于是在vscode里面進行開發,因此特此進行配置。 方法一 直接在vscode命令行中輸入如下命令: Start-Process powers…

IDEA如何創建原生maven子模塊

文件 -> 新建 -> 新模塊 -> Maven ArcheTypeMaven ArcheType界面中的輸入框介紹 名稱:子模塊的名稱位置:子模塊存放的路徑名創建Git倉庫:子模塊不單獨作為一個git倉庫,無需勾選JDK:JDK版本號父項:…

Linux網絡命令:網絡工具socat詳解

目錄 一、概述 二、基本用法 1、基本語法 2、常用選項 3、獲取幫助 三、用法示例 1. 監聽 TCP 端口并回顯接收到的數據 2. 通過 TCP 端口轉發數據到 UNIX 套接字 3. 將文件內容發送到 TCP 端口: 4. 使用偽終端進行串行通信 5、啟動一個TCP服務器 6、建…

Hi3861鴻蒙開發環境搭建

1.1 安裝配置Visual Studio Code 打開Download Visual Studio Code - Mac, Linux, Windows選擇下載安裝Windows系統的Visual Studio Code。 下載后進行安裝。Visual Studio Code安裝完成后,通過內置的插件市場搜索并安裝開發所需的插件如圖所示: 1.2 安…

實時消息推送系統,寫得太好了!

websocket 協議是在 http 協議上的一種補充協議,是 html5 的新特性,是一種持久化的協議。其實 websocket 和 http 關系并不是很大,不過都是屬于應用層的協議,接下來我們就開始實戰。 websocket 定時推送 本教程基于 springboot …

symbol數據類型以及應用場景

在js中,Symbol是一種基本數據類型,是在ECMAScript 6 (ES6) 中引入的新特性。表示獨一無二 Symbol的定義 Symbol是不完整的構造函數,創建symbol對象時不需要new操作符,原因是通過 new 實例化的結果是一個 object 對象,而不是原始類型的 symbol。 var s…

STL--棧(stack)

stack 棧是一種只在一端(棧頂)進行數據插入(入棧)和刪除(出棧)的數據結構,它滿足后進先出(LIFO)的特性。 使用push(入棧)將數據放入stack,使用pop(出棧)將元素從容器中移除。 使用stack,必須包含頭文件: #include<stack>在頭文件中,class stack定義如下: namespace std…

Druid 連接池在很多方面表現出色,但在實際應用中也可能會遇到一些缺陷或問題。

Druid 連接池是阿里巴巴開源的一個功能強大的數據庫連接池&#xff0c;它具有高性能、可靠性、可管理性、安全性和擴展性等特點。然而&#xff0c;盡管 Druid 連接池在很多方面表現出色&#xff0c;但在實際應用中也可能會遇到一些缺陷或問題。 1. **連接耗盡問題**&#xff1…

13 - matlab m_map地學繪圖工具基礎函數 - 介紹創建管理顏色映射的函數m_colmap和輪廓圖繪制顏色條的函數m_contfbar

13 - matlab m_map地學繪圖工具基礎函數 - 介紹創建管理顏色映射的函數m_colmap和輪廓圖繪制顏色條的函數m_contfbar 0. 引言1. 關于m_colmap2. 關于m_contfbar3. 結語 0. 引言 本篇介紹下m_map中用于創建和管理顏色映射函數&#xff08;m_colmap&#xff09;和 為輪廓圖繪制顏…