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

如何获取列的最小值和最大值?

  •  0
  • ScalaBoy  · 技术社区  · 6 年前

    我想对我的代码进行概念检查。目标是计算字段的最小值 minTimestamp 以及字段的最大值 maxTimestamp 在数据帧中 df ,并删除所有其他值。 例如:

    测向

    src    dst  minTimestamp   maxTimestamp
    1      3    1530809948     1530969948
    1      3    1540711155     1530809945
    1      3    1520005712     1530809940
    2      3    1520005712     1530809940
    

    答案应如下:

    结果:

    src    dst  minTimestamp   maxTimestamp
    1      3    1520005712     1530969948
    2      3    1520005712     1530809940
    

    这是我的代码:

    val cw_min = Window.partitionBy($"src", $"dst").orderBy($"minTimestamp".asc)
    val cw_max = Window.partitionBy($"src", $"dst").orderBy($"maxTimestamp".desc)
    
    val result = df
      .withColumn("rn", row_number.over(cw_min)).where($"rn" === 1).drop("rn")
      .withColumn("rn", row_number.over(cw_max)).where($"rn" === 1).drop("rn")
    

    可以用吗 Window 像我在代码示例中那样按顺序运行? 问题是我总是得到 最小时间戳 最大时间戳 .

    2 回复  |  直到 6 年前
        1
  •  -2
  •   botchniaque    6 年前

    val spark: SparkSession = ???
    df.createOrReplaceTempView("myDf")
    val df2 = spark.sql("""
        select 
          src, 
          dst, 
          min(minTimestamp) as minTimestamp, 
          max(maxTimestamp) as maxTimestamp 
        from myDf group by src, dst""")
    

    val df2 = df
       .groupBy("src", "dst")
       .agg(min("minTimestamp"), max("maxTimestamp"))
    
        2
  •  2
  •   Leo C    6 年前

    groupBy min max

    import org.apache.spark.sql.functions._
    
    val df = Seq(
      (1, 3, 1530809948L, 1530969948L),
      (1, 3, 1540711155L, 1530809945L),
      (1, 3, 1520005712L, 1530809940L),
      (2, 3, 1520005712L, 1530809940L)
    ).toDF("src", "dst", "minTimestamp", "maxTimestamp")
    
    df.groupBy("src", "dst").agg(
        min($"minTimestamp").as("minTimestamp"), max($"maxTimestamp").as("maxTimestamp")
      ).
      show
    // +---+---+------------+------------+                                             
    // |src|dst|minTimestamp|maxTimestamp|
    // +---+---+------------+------------+
    // |  2|  3|  1520005712|  1530809940|
    // |  1|  3|  1520005712|  1530969948|
    // +---+---+------------+------------+