在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)
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|
+