假设我有一个具有以下属性的Product对象:
Name, Code, ClientId
我想写一份工作,每个ClientId
仅需要3个产品。
我能做到吗?
示例:我有以下产品:
P1,1,1
P2,2,1
P3,3,1
P4,4,1
P5,5,1
P6,6,2
P7,7,2
P8,8,2
P9,9,2
所以我想为每个ClientId获得3种产品,我想要的结果是:
P1,1,1
P2,2,1
P3,3,1
P6,6,2
P7,7,2
P8,8,2
答案 0 :(得分:1)
假设您的Product
被建模为一个案例类,产品列表是一个RDD
,则可以按ClientId
分组以创建地图,并从分组中每组抽取3个地图值:
case class Prod(Name: String, Code: Long, ClientId: Long)
val rdd = sc.parallelize(Seq(
Prod("P1", 1, 1), Prod("P2", 2, 1), Prod("P3", 3, 1), Prod("P4", 4, 1), Prod("P5", 5, 1),
Prod("P6", 6, 2), Prod("P7", 7, 2), Prod("P8", 8, 2), Prod("P9", 9, 2)
))
rdd.groupBy(_.ClientId).flatMap(_._2.take(3)).collect
// res1: Array[Prod] = Array(
// Prod(P1,1,1), Prod(P2,2,1), Prod(P3,3,1), Prod(P6,6,2), Prod(P7,7,2), Prod(P8,8,2)
// )
答案 1 :(得分:0)
您可以尝试这样。
val rd1 = sc.textFile(path2) // your sample data created as RDD
.map(x => x.split(",")).map(x => (x(0),x(1),x(2)))
.groupBy(x=> x._3) // grouping based on **ClientId**
rd1.foreach(x => println((x._1,x._2.take(3)))) // here you can give some number X in take method to get X records of that key
输出:
(1,List((P1,1,1), (P2,2,1), (P3,3,1)))
(2,List((P6,6,2), (P7,7,2), (P8,8,2)))