【发布时间】:2020-04-27 17:44:13
【问题描述】:
我想过滤掉列表中所有列的值为零的行。
假设例如我们有以下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$catalyst$analysis$ResolveLambdaVariables$$resolve(更高...
我可以想到一个 pandas udf 解决方案,但我的 df 非常大,这可能是一个瓶颈。
编辑:
使用@Psidom 的答案时,我收到以下错误
py4j.protocol.Py4JJavaError:调用 o2508.filter 时出错。 : java.lang.StackOverflowError 在 org.apache.spark.sql.catalyst.expressions.Expression.references(Expression.scala:88) 在 org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$references$1.apply(Expression.scala:88) 在 org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$references$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(List.scala:392) 在 scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 在 scala.collection.immutable.List.flatMap(List.scala:355)
【问题讨论】:
标签: python dataframe apache-spark pyspark apache-spark-sql