агрегирование с условием в групповом кадре искры - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть датафрейм

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

, поэтому я хотел применить условие при использовании groupby в функции agg, что если мы сделаем 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"))

output

  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") не равно нулю, то нам нужно использовать агрегацию, например: 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

и если в этой группе данных значение col ("lag_interval") all равно нулю, нам нужновыходной сигнал как min ("gpsdt"), max ("lead_gpsdt") это условие будет применяться к нижнему набору данных

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

1 Ответ

0 голосов
/ 24 сентября 2018

Условная дилемма , которую вы должны решить, должна быть решена с помощью простой 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]|
+---+--------+----------+

и я думаю, у вас уже есть идея, как сделать first("lat-long").alias("start_coordinate"), last("lat-long").alias("end_coordinate"), как вы это сделали.

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...