Используйте 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"))
Конечно, это предполагает, что нули не являются строками, а фактическими нулями.