【问题标题】:For dataframe segmentation and sorting operations-spark用于数据帧分割和排序操作-spark
【发布时间】:2018-02-26 12:27:43
【问题描述】:

有这样的数据框,它只有一列。每一行都是这样的:

A:6,B:5,C:2
A:8,C:7,D:5,E:2,F:1
A:12,F:7,G:6,W:1
B:13,H:4,I:2
....

例如:现在我创建一个只有四行的数据框:

import sqlContext.implicits._
val df = Seq(
  (A:6,B:5,C:2),
  (A:8,C:7,D:5,E:2,F:1),
  (A:12,F:7,G:6,W:1),
  (B:13,H:4,I:2)
).toDF("key_value")

每一行至少有三个元素,然后每个元素用逗号分隔。每个字母后面是它对应的值。并且每一行的元素已经按照值的降序排列。现在我要提取组合每行的前三个值,将它们合并在一起,并将相同的字母值添加在一起,使它们显示为:

A:###
B:###
C:###
.....

PS:每一行只有一个元素。我该如何编写这个函数?请帮助我!

【问题讨论】:

  • 您的要求建议使用 rdd 而不是数据框。所以不要费心转换成数据框。只需在 rdd 中进行计算即可。
  • 我应该如何处理 rdd?Thx!
  • 你能用你如何创建数据框来更新这个问题吗?
  • 好的。我已经更新了。
  • 所以每一行都是一个类似"A:6,B:5,C:2"的字符串,对吧?

标签: scala apache-spark dataframe


【解决方案1】:

对您的需求的分析表明,使用 RDD 应该比使用数据框更高效且容易

所以不要创建数据框,而是创建一个 rdd

val rdd = sc.parallelize(Seq(
  ("A:6,B:5,C:2"),
  ("A:8,C:7,D:5,E:2,F:1"),
  ("A:12,F:7,G:6,W:1"),
  ("B:13,H:4,I:2")
))

并使用下面的方法得到你想要的输出(为了便于理解,我已经解释和格式化了)

rdd.flatMap(row =>                          //flattening the highest three key value pairs
  {
    row.split(",").map(array =>             //splitted the string row to array of each elements
      {
        val arrayed = array.split(":")      //splitted each element for key and value pairs
        (arrayed(0), arrayed(1).toInt)      // tuple2(String, Int) is created
      })
      .sortWith(_._2 > _._2)                // sorted in descending order of integer values
      .take(3)                              // take the highest three key value pair
  }
  ).reduceByKey(_ + _)                      // adding all the values with same key

你应该有以下输出

(G,6)
(B,18)
(A,26)
(I,2)
(H,4)
(C,9)
(F,7)
(D,5)

希望回答对你有帮助

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2018-04-17
    • 2021-11-21
    • 1970-01-01
    • 2013-08-23
    • 2016-03-18
    • 2021-03-07
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多