每个键仅获取多个值

时间:2018-06-20 12:05:47

标签: scala apache-spark

假设我有一个具有以下属性的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

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)))