Pyspark: есть ли эффективный способ исключить строки только с нулевыми значениями, кроме pk?

#python #dataframe #pyspark #null #sdf

#python #фрейм данных #pyspark #null #sdf

Вопрос:

У меня есть sdf с идентификатором (PK) и несколькими столбцами, последний из которых может содержать нулевые значения. Я хотел бы найти эффективный способ фильтрации строк, в столбцах которых есть хотя бы одно значение.

Допустим, вот таблица:

  ----------- ------- ------- ------- 
|         id| clm_01| clm_02| clm_03|...
 ----------- ------- ------- ------- -
|    10001  |   null|  null |      5|...
|    10002  |      1|     3 |      2|...
|    10003  |   null|  null |   null|...
        ...
 ----------- ------- ------- ------- 
  

Из приведенной выше таблицы я хотел бы получить строку с идентификатором 10003.
Это можно легко сделать с помощью приведенного ниже сценария;

 sdf.withColumn(
  'flg', 
  when(
   col('clm_01').isNull() amp; col('clm_02').isNull() amp; col('clm_01').isNull(),1).
  otherwise(0) 
).
filter(col('flg') != 1)
  

Но как вы применяете условие к большему количеству столбцов, не повторяя цепочку isNull() сто раз?

Заранее спасибо за помощь.

Ответ №1:

Вы можете использовать coalesce least greatest функции или . Они возвращаются null , если все столбцы null :

 from pyspark.sql import functions as F

columns = list(set(sdf.columns) - {'id'})
sdf = sdf.filter(F.coalesce(*columns).isNull())
  

или таким образом только с coalesce :

 sdf = sdf.filter(F.coalesce(*sdf.columns) == F.col('id'))