代码之家  ›  专栏  ›  技术社区  ›  RefiPeretz

SPARK聚合基于一列的所有列[重复]

  •  1
  • RefiPeretz  · 技术社区  · 6 年前

    为简单起见,假设我有以下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") 我不在乎我们取哪一行。

    我试着在网上找到一些干净、有火花的东西。我很清楚如何在MapReduce中做到这一点,但我在SPARK上找不到方法。

    我正在研究SPARK 1.6

    2 回复  |  直到 6 年前
        1
  •  3
  •   Ramesh Maharjan    6 年前

    你可以简单地做

    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    |
    +-----+-----+-----+
    
        2
  •  1
  •   koiralo    6 年前

    您可以使用 struct 与列一样 Y Z

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

    输出:

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

    希望这有帮助1