Apache spark 在PySpark数据框中删除包含特定值的行

Apache spark 在PySpark数据框中删除包含特定值的行,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我有一个pyspark数据帧,如: A B C 1 NA 9 4.25 6.4.2 5 1 NA 我想删除包含值“NA”的行。在本例中,第一行和最后一行。如何使用Python和Spark实现这一点 根据评论更新: 正在寻找一种解决方案,该解决方案可以删除任何列中包含字符串:NA的行 只需使用数据帧表达式: l = [('1','NA','9') ,('4','2', '5') ,('6','4','2') ,('5','NA','1')] df = spark.crea

我有一个pyspark数据帧,如:

A B C
1 NA 9
4.25
6.4.2
5 1 NA

我想删除包含值“NA”的行。在本例中,第一行和最后一行。如何使用Python和Spark实现这一点


根据评论更新: 正在寻找一种解决方案,该解决方案可以删除任何列中包含字符串:NA的行

只需使用数据帧表达式:

l = [('1','NA','9')
    ,('4','2', '5')
    ,('6','4','2')
    ,('5','NA','1')]
df = spark.createDataFrame(l,['A','B','C'])
#The following command requires that the checked columns are strings!
df = df.filter((df.A != 'NA') & (df.B != 'NA') & (df.C != 'NA'))
df.show()

+---+---+---+ 
|  A|  B|  C| 
+---+---+---+ 
|  4|  2|  5| 
|  6|  4|  2| 
+---+---+---+
@bluephantom:如果有数百列,只需通过列表理解生成一个字符串表达式:

#In my example are columns need to be checked
listOfRelevantStringColumns = df.columns
expr = ' and '.join('(%s != "NA")' % col_name for col_name in listOfRelevantStringColumns)
df.filter(expr).show()

在Scala中,我的做法有所不同,但使用pyspark实现了这一点。这不是我最喜欢的答案,但这是因为我不太了解自己。在Scala,事情似乎更容易。与数组不同的是,没有针对所有列的全局匹配,只要找到一列就可以立即停止。在列数方面是动态的

假设数据中没有~~作为数据的一部分,可以拆分为数组,但决定不在此处执行。使用None代替NA

返回:

+---+---+---+---+
|  k| v1| v2| v3|
+---+---+---+---+
|  2|  c|  3|  d|
+---+---+---+---+

NA是什么意思?这是否意味着你失去了价值?或者在您的数据帧中是这样的?在这种情况下,您的B列将是一个字符串!请确认.NA不是缺少的值。这是一个字符串关键字。我想删除所有包含字符串“NA”的行。此外,NA也可能出现在另一列中,不一定出现在B列中,因此该行也应该被删除。是的,因此spark将它们标记为字符串,因为存在“NA”。我想删除“NA”,这样列就可以标记为整数。一种方法是用0替换“NA”。我不能用正确的语法实现它。你应该添加一个最小的例子和你迄今为止所尝试的。一个简单的过滤器就能完成这项工作,如果有数百列呢?我已经更新了我的帖子。我认为这是为filter方法使用字符串表达式的最佳方式。当然,我同意。我想的是,如果找到第一个匹配项,我们如何使其工作并停止?我正在从Scala侧面查看它。在第一次基于行或基于列的匹配之后,您想停止吗?也许有必要提出一个新问题来讨论这个问题。
+---+---+---+---+
|  k| v1| v2| v3|
+---+---+---+---+
|  2|  c|  3|  d|
+---+---+---+---+