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您对持久化数据帧以及如何再次使用它有什么看法?您可以使用持久化或缓存。两者都保存数据,以便无论何时对持久化或缓存的数据执行操作,都不会从头开始重新计算。使用缓存数据与任何其他计算一样。好的,我知道了,我无法获得如何使用缓存/持久化数据帧以供进一步使用。先生,您对持久化数据帧以及如何再次使用数据帧有何看法?您可以使用持久化或缓存。两者都保存数据,以便无论何时对持久化或缓存的数据执行操作,都不会从头开始重新计算。使用缓存数据与其他任何计算一样。好的,我明白了,我不知道如何使用缓存/持久化数据帧以供进一步使用。