Scala 使用groupby spark数据帧中的条件进行聚合

Scala 使用groupby spark数据帧中的条件进行聚合,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个数据帧 id lat long lag_lat lag_long detector lag_interval gpsdt lead_gpsdt 1 12 13 12 13 1 [1.5,3.5] 4 4.5 1 12 13 12 13 1 null 4.5 5 1 12 13 12 13 1

我有一个数据帧

id lat long lag_lat lag_long detector lag_interval  gpsdt  lead_gpsdt
  1  12   13    12       13        1        [1.5,3.5]  4      4.5
  1  12   13    12       13        1        null       4.5    5
  1  12   13    12       13        1        null       5      5.5
  1  12   13    12       13        1        null       5.5    6
  1  13   14    12       13        2        null       6      6.5
  1  13   14    13       14        2        null       6.5    null
  2  13   14    13       14        2        [0.5,1.5]  2.5    3.5  
  2  13   14    13       14        2        null       3.5    4 
  2  13   14    13       14        2        null       4      null
所以我想在agg函数中使用groupby时应用一个条件,如果我们使用groupby col(“id”)和col(“detector”),那么我想检查一个条件,如果该组中的lag_interval有任何非空值,那么在聚合中我想要两列,一列是

 min("lag_interval.col1") and other is max("lead_gpsdt") 
如果不满足上述条件,则我希望

min("gpsdt"), max("lead_gpsdt")
使用这种方法,我希望获得具有条件的数据

df.groupBy("detector","id").agg(first("lat-long").alias("start_coordinate"),
    last("lat-long").alias("end_coordinate"),struct(min("gpsdt"), max("lead_gpsdt")).as("interval"))
输出

  id interval  start_coordinate end_coordinate
  1   [1.5,6]      [12,13]         [13,14] 
  1   [6,6.5]      [13,14]         [13,14]
  2   [0.5,4]      [13,14]         [13,14]
**

更多解释

** 如果我们看到groupby(“id”,“detector”)所做的一部分就是拿出一部分

我们必须看到,如果在这组数据中,如果col(“lag_interval”)中的一个值不为null,那么我们需要使用这样的聚合:min(lag_interval.col1)、max(lead_gpsdt) 此条件将适用于以下数据集

id lat long lag_lat lag_long detector lag_interval  gpsdt  lead_gpsdt
 1  12   13    12       13        1        [1.5,3.5]  4      4.5
 1  12   13    12       13        1        null       4.5    5
 1  12   13    12       13        1        null       5      5.5
 1  12   13    12       13        1        null       5.5    6
id lat long lag_lat lag_long detector lag_interval  gpsdt  lead_gpsdt
 1  13   14    12       13        2        null       6      6.5
 1  13   14    13       14        2        null       6.5    null
如果col的all值(“lag_interval”)在该组数据中为null,那么我们需要聚合输出作为 最小值(“gpsdt”)、最大值(“铅含量”) 此条件将适用于以下数据集

id lat long lag_lat lag_long detector lag_interval  gpsdt  lead_gpsdt
 1  12   13    12       13        1        [1.5,3.5]  4      4.5
 1  12   13    12       13        1        null       4.5    5
 1  12   13    12       13        1        null       5      5.5
 1  12   13    12       13        1        null       5.5    6
id lat long lag_lat lag_long detector lag_interval  gpsdt  lead_gpsdt
 1  13   14    12       13        2        null       6      6.5
 1  13   14    13       14        2        null       6.5    null
您所面临的条件困境应该通过使用简单的
when
内置函数来解决,如下所示

import org.apache.spark.sql.functions._
df.groupBy("id","detector")
  .agg(
    struct(
      when(isnull(min("lag_interval.col1")), min("gpsdt")).otherwise(min("lag_interval.col1")).as("min"),
      max("lead_gpsdt").as(("max"))
    ).as("interval")
  )
这将为您提供如下输出:

+---+--------+----------+
|id |detector|interval  |
+---+--------+----------+
|2  |2       |[0.5, 4.0]|
|1  |2       |[6.0, 6.5]|
|1  |1       |[1.5, 6.0]|
+---+--------+----------+
我想你一定已经知道如何做了,像你做的那样,先做
,后做别名(“开始坐标”),最后做别名(“结束坐标”)

我希望答案是有帮助的

当内置函数如下所示时,您应该使用简单的
来解决条件困境

import org.apache.spark.sql.functions._
df.groupBy("id","detector")
  .agg(
    struct(
      when(isnull(min("lag_interval.col1")), min("gpsdt")).otherwise(min("lag_interval.col1")).as("min"),
      max("lead_gpsdt").as(("max"))
    ).as("interval")
  )
这将为您提供如下输出:

+---+--------+----------+
|id |detector|interval  |
+---+--------+----------+
|2  |2       |[0.5, 4.0]|
|1  |2       |[6.0, 6.5]|
|1  |1       |[1.5, 6.0]|
+---+--------+----------+
我想你一定已经知道如何做了,像你做的那样,先做
,后做别名(“开始坐标”),最后做别名(“结束坐标”)


我希望答案有帮助

是给定输入的输出吗?你能再详细一点吗?@RameshMaharjan是的,先生,我已经更新了一个关于结构列的输出滞后间隔的详细解释?您还可以共享输入数据帧的模式吗?@RameshMaharjan是的,它是一个结构,第一个(“lat-long”)和最后一个(“lat-long”)是什么?没有像lat long这样的专栏,是吗?请参阅下面的答案,如果它有助于确定给定输入的输出?你能再详细一点吗?@RameshMaharjan是的,先生,我已经更新了一个关于结构列的输出滞后间隔的详细解释?您还可以共享输入数据帧的模式吗?@RameshMaharjan是的,它是一个结构,第一个(“lat-long”)和最后一个(“lat-long”)是什么?没有像lat long这样的专栏,是吗?请参阅下面的我的答案,如果它有助于SSIR您对持久化数据帧以及如何再次使用它有什么看法?您可以使用持久化或缓存。两者都保存数据,以便无论何时对持久化或缓存的数据执行操作,都不会从头开始重新计算。使用缓存数据与任何其他计算一样。好的,我知道了,我无法获得如何使用缓存/持久化数据帧以供进一步使用。先生,您对持久化数据帧以及如何再次使用数据帧有何看法?您可以使用持久化或缓存。两者都保存数据,以便无论何时对持久化或缓存的数据执行操作,都不会从头开始重新计算。使用缓存数据与其他任何计算一样。好的,我明白了,我不知道如何使用缓存/持久化数据帧以供进一步使用。