先考虑一个普通交易案例,在用户交易的过程中有两份数据ch04_data_transactions.txt和ch04_data_products.txt,它们前者是交易数据,后者是产品数据。数据格式如下:
交易数据:
2015-03-30#6:55 AM#51#68#1#9506.21
2015-03-30#7:39 PM#99#86#5#4107.59
2015-03-30#11:57 AM#79#58#7#2987.22
2015-03-30#12:46 AM#51#50#6#7501.89
2015-03-30#11:39 AM#86#24#5#8370.2
2015-03-30#10:35 AM#63#19#5#1023.57
2015-03-30#2:30 AM#23#77#7#5892.41
2015-03-30#7:41 PM#49#58#4#9298.18
2015-03-30#9:18 AM#97#86#8#9462.89
2015-03-30#10:06 PM#94#26#4#4199.15
......
每一行都包含交易日期、时间、客户ID、产品ID、数量、产品价格,并用“#”隔开。
产品数据
1#ROBITUSSIN PEAK COLD NIGHTTIME COLD PLUS FLU#9721.89#10
2#Mattel Little Mommy Doctor Doll#6060.78#6
3#Cute baby doll, battery#1808.79#2
4#Bear doll#51.06#6
5#LEGO Legends of Chima#849.36#6
6#LEGO Castle#4777.51#10
7#LEGO Mixels#8720.91#1
8#LEGO Star Wars#7592.44#4
9#LEGO Lord of the Rings#851.67#2
10#LEGO The Hobbit#7314.55#9
11#LEGO Minecraft#5646.81#3
12#LEGO Hero Factory#6911.2#1
13#LEGO Architecture#604.58#5
......
每一行都包含产品ID、产品名称、价格、库存,并用“#”隔开。
键值对RDD
假设营销部希望基于产品数据和交易数据向客户赠送产品。赠送的规则如下。
(1)向交易最多的客户发送一份礼物
(2)购买两个或多个玩具套装可享受5%的折扣
(3)为购买5本以上字典的客户赠送牙刷
(4)发送两件睡衣给消费最多的客户
键值对RDD的基本功能
以下代码段用来创建键值对RDD,其中客户ID作为键,交易记录作为值:
val spark = SparkSession.builder().appName("SparkInAction")
.master("local[*]").getOrCreate()
val sc = spark.sparkContext
val tranFile = sc.textFile("E:\\Scala_TestData\\ch04_data_transactions.txt")
val tranData = tranFile.map(_.split("#"))
var transByCust = tranData.map(tran=>(tran(2).toInt,tran))
1、获取key和value
现在已经有了键值对RDD,可以先看看有多少客户昨天买了东西。根据“获取客户ID列表->删除重复项->计算唯一客户ID的数量”的顺序可查看,如下:
transByCust.keys.distinct().count()
2、计数每个键的值
回顾任务(1),需要计算出每个客户做了多少交易,排序,并且返回最后一个数据,也就是交易此处最多的那位用户的数据。
transByCust.countByKey().toSeq.sortBy(_._2).last
(53,19)
ID为53的客户有19次交易,所以需要给他一个免费的礼物。
3、查找单键的值
可以使用lookup操作来获取ID为53的客户的交易记录
transByCust.lookup(53).foreach(
tran=>println(tran.mkString(","))
)
2015-03-30,6:18 AM,53,42,5,2197.85
2015-03-30,4:42 AM,53,44,6,9182.08
2015-03-30,2:51 AM,53,59,5,3154.43
2015-03-30,5:57 PM,53,31,5,6649