【问题标题】:Spark/Scala : Creating Nested Structure using ReduceByKey using RDD onlySpark/Scala:仅使用 RDD 使用 ReduceByKey 创建嵌套结构
【发布时间】:2017-08-29 11:15:38
【问题描述】:

Spark/Scala:仅使用 RDD 使用 ReduceByKey 创建嵌套结构

我只想使用 RDD 创建嵌套结构。我可以使用 groupBy 函数来做到这一点,该函数对于海量数据表现不佳。所以我想用reduceByKey来做,但我无法得到我想要的。任何帮助将不胜感激。

输入数据:

val sales=sc.parallelize(List(
  ("West",  "Apple",  2.0, 10),
  ("West",  "Apple",  3.0, 15),
  ("West",  "Orange", 5.0, 15),
  ("South", "Orange", 3.0, 9),
  ("South", "Orange", 6.0, 18),
  ("East",  "Milk",   5.0, 5)))

必需的输出是结构列表。我可以使用groupByKey 来做到这一点,如下所示:

sales.map(value => (value._1 ,(value._2,value._3,value._4  )) )
  .groupBy(_._1)
  .map { case(k,v) => (k, v.map(_._2)) }
  .collect()
  .foreach(println)

// (South,List((Orange,3.0,9), (Orange,6.0,18)))
// (East,List((Milk,5.0,5)))
// (West,List((Apple,2.0,10), (Apple,3.0,15), (Orange,5.0,15)))

但我想使用reduceByKey 实现同样的目的。我无法获得 List[Struct]。相反,我可以得到 List[List]。有没有办法获取 List[Struct]?

sales.map(value => (value._1 ,List(value._2,value._3,value._4)))
  .reduceByKey((a,b) => (a ++ b))
  .collect()
  .foreach(println)

// (South,List(Orange, 3.0, 9, Orange, 6.0, 18))
// (East,List(Milk, 5.0, 5))
// (West,List(Apple, 2.0, 10, Apple, 3.0, 15, Orange, 5.0, 15))

sales.map(value => (value._1 ,List(value._2,value._3,value._4)))
  .reduceByKey((a,b) =>(List(a) ++ List(b)))
  .collect()
  .foreach(println)

// (South,List(List(Orange, 3.0, 9), List(Orange, 6.0, 18)))
// (East,List(Milk, 5.0, 5))
// (West,List(List(List(Apple, 2.0, 10), List(Apple, 3.0, 15)), List(Orange, 5.0, 15)))

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-07
      • 2014-07-12
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多