Пример данных имеет 1 чистую строку, 1 строку с None
, 1 строку с ''
.
from pyspark.sql import function as F
df_struct.show()
+----+--------------+
| key| _value|
+----+--------------+
|123k|[BLACK, black]|
|123k| [WHITE,]|
|124k| [BLUE, ]|
+----+--------------+
Если у вас нет spark2.4, , вы можете используйте array_contains
, чтобы проверить наличие пустой строки. Делая это, если в какой-либо строке есть ноль, вывод для array_contains будет null
, или если в нем будет пустая строка "", вывод будет true
. Затем вы можете filter
в этом новом столбце boolean
, как показано ниже.
df.withColumn("boolean", F.array_contains("_value", ""))\
.filter(~((F.col("boolean")==True) | (F.col("boolean").isNull()))).drop("boolean").show()
+----+--------------+
| key| _value|
+----+--------------+
|123k|[BLACK, black]|
+----+--------------+
Вы можете удалить ~
, чтобы получить все остальные строки с None или пустыми строками .
df.withColumn("boolean", F.array_contains("_value", ""))\
.filter(((F.col("boolean")==True) | (F.col("boolean").isNull()))).drop("boolean").show()
+----+--------+
| key| _value|
+----+--------+
|123k|[WHITE,]|
|124k|[BLUE, ]|
+----+--------+
Spark2.4:
Вы можете использовать функцию более высокого порядка array filter
, чтобы вынуть None
или ''
, а затем сравните size
в фрейме данных filter
.
df_struct.withColumn("_value2", F.expr("""filter(_value, x-> x is not null and x!='')"""))\
.filter((F.size("_value2")==F.size("_value"))).drop("_value2").show()
+----+--------------+
| key| _value|
+----+--------------+
|123k|[BLACK, black]|
+----+--------------+
, чтобы получить другие строки, которые имеют Nones или '' или оба . Вы можете поставить ~
перед выражением фильтра.
df_struct.withColumn("_value2", F.expr("""filter(_value, x-> x is not null and x!='')"""))\
.filter(~(F.size("_value2")==F.size("_value"))).drop("_value2").show()
+----+--------+
| key| _value|
+----+--------+
|123k|[WHITE,]|
|124k|[BLUE, ]|
+----+--------+
Вы можете также использовать функцию более высокого порядка exists
.
df.withColumn("boolean", F.expr("""exists(_value, x-> x is null or x=='')"""))\
.filter(~(F.col("boolean")==True)).drop("boolean").show()
+----+--------------+
| key| _value|
+----+--------------+
|123k|[BLACK, black]|
+----+--------------+
Удалите ~
, чтобы получить все строки с Nones
или ""
:
df.withColumn("boolean", F.expr("""exists(_value, x-> x is null or x=='')"""))\
.filter((F.col("boolean")==True)).drop("boolean").show()
+----+--------+
| key| _value|
+----+--------+
|123k|[WHITE,]|
|124k|[BLUE, ]|
+----+--------+