当前位置: 首页 > 知识库问答 >
问题:

Pyspark检查是否有任何行大于零

祁烈
2023-03-14

我想过滤掉列表中所有列的值为零的行。

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|  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$catalys$analysis$resolvelambdavariables$$resolve(更高...

编辑:

当使用@psidom的答案时,我得到以下错误

py4j.protocol.py4jJavaError:调用O2508.Filter时出错。:java.lang.StackOverflowError at org.apache.spark.sql.catalyst.expressions.references(expression.scala:88)at org.apache.spark.sql.catalyst.expressions.expression$$$anonfun$references$1.应用(expression.scala:88)at org.apache.spark.sql.catalyst.expressions.expression$$$anonfun$references$1.应用(expression.scala:88)at org.apache.spark.sql.catalyst.expressions.expression$$$anonfun$references$1.应用elike.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)在scala.collection.immutable.list.flatmap

共有1个答案

刘弘济
2023-03-14

您可以将列作为数组传递给UDF,然后检查所有值是否为零,然后应用筛选器:

from pyspark.sql.types import BooleanType
from pyspark.sql.functions import udf, array, col

all_zeros_udf = udf(lambda arr: arr.count(0) == len(arr), BooleanType())

df = spark.createDataFrame([(0, 1, 1, 2,1), (0, 0, 1, 0, 1), (1, 0, 1, 1 ,1)], ['a', 'b', 'c', 'd', 'e'])

df
.withColumn('all_zeros', all_zeros_udf(array('a', 'b', 'd'))) # pass the columns as array
.filter(~col('all_zeros')) # Filter the columns where all values are NOT zeros
.drop('all_zeros')  # Drop the column
.show()

结果:

+---+---+---+---+---+
|  a|  b|  c|  d|  e|
+---+---+---+---+---+
|  0|  1|  1|  2|  1|
|  1|  0|  1|  1|  1|
+---+---+---+---+---+
 类似资料:
  • 我有一个PySpark数据帧,如下所示: 我想在表上进行查找,看看是否存在特定的行。例如,对于,测试,代码应返回,对于,测试,代码应返回。 我试过这个: 不幸的是,这段代码需要很长时间才能执行,而且由于这是一个将执行多次的查找(针对不同的a和B值),我希望有一个更快的方法来完成这项任务。 我正在考虑的其他解决方案有: 将PySpark数据帧转换为Pandas数据帧,因为行查找更快 使用或虽然从我所

  • 问题内容: 结果集没有hasNext的方法。我想检查resultSet是否有任何值 这是正确的方法吗 问题答案: 没错,最初的光标指向第一行之前,如果第一次调用,则没有数据。 如果使用此方法,则由于它现在已定位在第一行之后,因此可能必须在复位后立即调用。 但是,应该注意的是,塞弗(Seifer)在下面的回答是对该问题的更优雅的解决方案。

  • 问题内容: 我很惊讶地发现这种情况总是成立的: 似乎无论最初是什么类型,它都将转换为相应类的实例。是否存在确定对象是否可靠的方法? 问题答案: 更新 我在下面显示的代码被报告在发行版本中不起作用。(请参阅下面的Paul Cantrell的评论。) 对于我的“据我测试”的道歉过于有限。 当我找到关于此的更多信息时,我将更新此答案。 我不确定我们是否可以在下一个Beta(或GM或已发布的版本…)中看到

  • null null 我想做的是,当我点击任何按钮时,它检查是否有任何其他按钮具有类“ButtonActive”,如果任何其他按钮具有这个类,它就从另一个按钮中移除这个类,并将它添加到我点击的按钮中。因此它应该始终是一个具有“ButtonActive”类的按钮。

  • 问题内容: 如果“表”没有行。什么是最简单的检查方法? 问题答案: 您可以使用mysql_num_rows($ results) 来检查是否返回了0行,或者使用以下更快的替代方法:

  • 所以我应该创建一个方法来检查字符串是否包含任何数字。如果有,它将返回“yes”,如果没有,它将返回“no”。到目前为止,我认为我已经做了所有正确的事情,但不确定如何使用indexOf()搜索0-9之间的任何数字。请注意,我是javascript的初学者,所以我将感谢初学者友好的回复。