Столбец DataBrame GroupBy без агрегирования и установки ненулевых значений - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть датафрейм с записями, подобными приведенным ниже:

+---+----+----+
|id |L1  |L2  |
+---+----+----+
|101|202 |null|
|101|null|303 |
+---+----+----+

Это простой способ для groupBy и получения результата, как показано ниже в Spark SQL:

+---+----+----+
|id |L1  |L2  |
+---+----+----+
|101|202 |303 |
+---+----+----+

Спасибо.

1 Ответ

1 голос
/ 28 февраля 2020

Используйте max или min для агрегирования данных. Поскольку у вас есть только одно действительное значение, это будет то, что будет выбрано. Обратите внимание, что здесь невозможно использовать first (что быстрее), поскольку оно все еще может возвращать нулевые значения.

Когда столбцы имеют числовой тип c, это можно решить следующим образом:

df.groupBy("id").agg(max($"L1").as("L1"), max($"L2").as("L2"))

Однако, если вы имеете дело со строками, вам нужно собрать все значения в виде списка (или набора), а затем использовать coalesce:

df.groupBy("id")
  .agg(coalesce(collect_list($"L1")).as("L1"), coalesce(collect_list($"L2")).as("L2"))

Конечно, это предполагает, что нули не являются строками, а фактическими нулями.

...