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

时间:2018-07-05 17:02:20

标签: scala apache-spark apache-spark-sql

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

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函数? 问题是我总是得到相同的minTimestampmaxTimestamp值。

2 个答案:

答案 0 :(得分:2)

您可以使用DataFrame groupBy来聚合minmax

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|
// +---+---+------------+------------+

答案 1 :(得分:-2)

为什么不使用spark SQL并做

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""")

您还可以使用API​​进行相同操作:

val df2 = df
   .groupBy("src", "dst")
   .agg(min("minTimestamp"), max("maxTimestamp"))