Есть ли способ получить значение из столбца в определенной строке и поместить его в следующую строку? - PullRequest
0 голосов
/ 22 мая 2019

У меня есть данные, которые выглядят следующим образом

ID    Sensor          No
1     specificSensor  1
2     1234            null 
3     1234            null
4     specificSensor  2
5     2345            null
6     2345            null
7

... 

Мне нужен такой формат вывода

ID    Sensor          No
1     specificSensor  1
2     1234            1 
3     1234            1
4     specificSensor  2
5     2345            2
6     2345            2
7
...

Я использую Apache Spark в Java.

после этого данные обрабатываются с использованием групповой и сводной информации.

Я думаю о чем-то вроде

df.withColumn("No", functions.when(df.col("Sensor").equalTo("specificSensor"), functions.monotonically_increasing_id())
//this works as I need it
.otherwise(WHEN NULL THEN VALUE ABOVE);

Я не знаю, возможно ли это каким-то образом.

Помощь оценена, спасибо большое!

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Кадр данных с диапазонами идентификаторов датчиков может быть создан, а затем присоединен к исходному кадру данных:

val df = Seq((1, "specificSensor", Some(1)),
  (2, "1234", None),
  (3, "1234", None),
  (4, "specificSensor", Some(2)),
  (5, "2345", None),
  (6, "2345", None))
  .toDF("ID", "Sensor", "No")

val idWindow = Window.orderBy("ID")
val sensorsRange = df
    .where($"Sensor" === "specificSensor")
    .withColumn("nextId", coalesce(lead($"id", 1).over(idWindow), lit(Long.MaxValue)))

sensorsRange.show(false)

val joinColumn = $"d.ID" > $"s.id" && $"d.ID" < $"s.nextId"
val result =
  df.alias("d")
    .join(sensorsRange.alias("s"), joinColumn, "left")
    .select($"d.ID", $"d.Sensor", coalesce($"d.No", $"s.No").alias("No"))

Вывод:

+---+--------------+---+-------------------+
|ID |Sensor        |No |nextId             |
+---+--------------+---+-------------------+
|1  |specificSensor|1  |4                  |
|4  |specificSensor|2  |9223372036854775807|
+---+--------------+---+-------------------+


+---+--------------+---+
|ID |Sensor        |No |
+---+--------------+---+
|1  |specificSensor|1  |
|2  |1234          |1  |
|3  |1234          |1  |
|4  |specificSensor|2  |
|5  |2345          |2  |
|6  |2345          |2  |
+---+--------------+---+
1 голос
/ 22 мая 2019

Использование last агрегации с ignoreNulls над упорядоченным окном делает трюк

df.select(
    $"ID",
    $"Sensor",
    last($"No", ignoreNulls = true) over Window.orderBy($"ID") as "No")
  .show()

Вывод:

+---+--------------+---+
| ID|        Sensor| No|
+---+--------------+---+
|  1|specificSensor|  1|
|  2|          1234|  1|
|  3|          1234|  1|
|  4|specificSensor|  2|
|  5|          2345|  2|
|  6|          2345|  2|
+---+--------------+---+

PS У меня сейчас нет рабочей настройки Java, но я долженлегко перевести

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