В Scala я делал это по-другому, но добился этого с помощью pyspark.Не мой любимый ответ, но это из-за меньшего знания pyspark моей стороны.В Scala все кажется проще.В отличие от массива, нет глобального сопоставления со всеми столбцами, которые могут остановиться, как только найдется один.Динамический с точки зрения количества столбцов.
Допущения, сделанные для данных, не имеющих ~~ в качестве части данных, могли бы быть разделены на массив, но решили не делать этого здесь. Использование None вместо NA .
from pyspark.sql import functions as f
data = [(1, None, 4, None),
(2, 'c', 3, 'd'),
(None, None, None, None),
(3, None, None, 'z')]
df = spark.createDataFrame(data, ['k', 'v1', 'v2', 'v3'])
columns = df.columns
columns_Count = len(df.columns)
# colCompare is String
df2 = df.select(df['*'], f.concat_ws('~~', *columns).alias('colCompare') )
df3 = df2.filter(f.size(f.split(f.col("colCompare"), r"~~")) == columns_Count).drop("colCompare")
df3.show()
возвращает:
+---+---+---+---+
| k| v1| v2| v3|
+---+---+---+---+
| 2| c| 3| d|
+---+---+---+---+