Я хотел отфильтровать строки с нулевыми значениями для всех столбцов в списке.
Предположим, например, что у нас есть следующие df,
df = spark.createDataFrame([(0, 1, 1, 2,1), (0, 0, 1, 0, 1), (1, 0, 1, 1 ,1)], ['a', 'b', 'c', 'd', 'e'])
+---+---+---+---+---+
| a| b| c| d| e|
+---+---+---+---+---+
| 0| 1| 1| 2| 1|
| 0| 0| 1| 0| 1|
| 1| 0| 1| 1| 1|
+---+---+---+---+---+
и список столбцы - это ['a', 'b', 'd'], поэтому отфильтрованный фрейм данных должен быть
+---+---+---+---+---+
| a| b| c| d| e|
+---+---+---+---+---+
| 0| 1| 1| 2| 1|
| 1| 0| 1| 1| 1|
+---+---+---+---+---+
Это то, что я пробовал,
df = df.withColumn('total', sum(df[col] for col in ['a', 'b', 'd']))
df = df.filter(df.total > 0).drop('total')
Это прекрасно работает для небольших наборов данных, но завершается неудачно со следующей ошибкой, если col_list очень длинный со следующей ошибкой.
ava.lang.StackOverflowErrorat org. apache .spark. sql .catalyst.analysis. ResolveLambdaVariables.org $ apache $ spark $ sql $ катализатор $ анализ $ ResolveLambdaVariables $$ Resolution (выше ...
Я могу подумать о решении pandas udf, но мой df очень большой, и это может быть узким местом.
Редактировать:
При использовании ответа @ Psidom я получаю следующую ошибку
py4j.protocol.Py4JJavaError: Произошла ошибка при вызове o2508.filter.: java .lang.StackOverflowError at org. apache .spark. sql .cata lyst.expressions.Expression.references (Expression. scala: 88) в org. apache .spark. sql .catalyst.expressions.Expression $$ anonfun $ ссылается на $ 1.apply (выражение. scala: 88 ) в орг. apache .spark. sql .catalyst.expressions.Expression $$ anonfun $ reference $ 1.apply (Expression. scala: 88) в scala .collection.TraversableLike $$ anonfun $ flatMap $ 1 .apply (TraversableLike. scala: 241) в scala .collection.TraversableLike $$ anonfun $ flatMap $ 1.apply (TraversableLike. scala: 241) в scala .collection.immutable.List.foreach (список) . scala: 392) в scala .collection.TraversableLike $ class.flatMap (TraversableLike. scala: 241) в scala .collection.immutable.List.flatMap (List. scala: 355)