【问题标题】:SPARK aggregate all columns base on one column [duplicate]SPARK基于一列聚合所有列[重复]
【发布时间】:2018-09-28 05:47:34
【问题描述】:

为简单起见,假设我有以下 daraframe:

col X col Y col Z
A     1     5
A     2     10
A     3     10
B     5     15

我想对 X 列进行分组并通过取 Z 的最小值进行聚合,但是我希望 Y 值是最小值 Z 的相邻值

df.groupBy("X").agg(min("Z"), take_y_according_to_min_z("Y")

期望的输出:

col X col Y col Z
A     1     5
B     5     15

注意:如果有两个以上的 min("Z") 值,我不在乎我们采用哪一行。

我试图在网上找到一些干净且 SPARKy 的东西。我很清楚如何在 MapReduce 中做到这一点,但我在 SPARK 上找不到方法。

我正在开发 SPARK 1.6

【问题讨论】:

  • 你可以在struct中结合y和z,找到最小值,最后再分开
  • 是的,这是我的第一种方法,正如我所说,如果有的话,我想要一种更干净的方法。对于简单的任务似乎需要付出很大的努力
  • 这不是很大的努力;)这很简单
  • @RameshMaharjan 构造 groupby 聚合然后爆炸?
  • 不 :) 你不需要爆炸。只需使用通配符 .* 分隔 struct 列我只是想找到一个重复项,因为我看到有人回答相同

标签: apache-spark dataframe bigdata aggregate


【解决方案1】:

您可以将struct 与列YZ 一起使用

df.groupBy("X").agg(min(struct("Z", "Y")).as("min"))
    .select("X", "min.*")

输出:

+---+---+---+
|X  |Z  |Y  |
+---+---+---+
|B  |15 |5  |
|A  |5  |1  |
+---+---+---+

希望这会有所帮助1

【讨论】:

    【解决方案2】:

    你可以这样做

    import org.apache.spark.sql.functions._
    df.select(col("Col X"), struct("Col Z", "Col Y").as("struct"))
      .groupBy("Col X").agg(min(col("struct")).as("min"))
        .select(col("Col X"), col("min.*"))
    

    你会得到你想要的

    +-----+-----+-----+
    |Col X|Col Y|Col Z|
    +-----+-----+-----+
    |B    |5    |15   |
    |A    |1    |5    |
    +-----+-----+-----+
    

    【讨论】:

    • struct("Col Y", "Col Z") 应该是 struct("Col Z", "Col Y") 至少必须来自 Col Z
    • agg(min(col("struct")).as("min")) 这怎么知道我想要 col Z 而不是 Y 的最小值?
    • @vindev 所以它从结构中的第一个单元格中取最小值?
    • 谢谢@vindev 我已更正
    • 是的@RefiPeretz,你说得对,它需要结构列中的所有元素,但第一个元素排在第一位,所以 Z 应该排在第一位
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2021-11-05
    • 2018-07-30
    • 2018-03-02
    相关资源
    最近更新 更多