从Spark Dataframe中删除空字符串

12

尝试删除包含空字符串的Spark dataframe列中的行。最初使用了val df2 = df1.na.drop(),但结果发现许多这些值被编码为""

我被困在使用Spark 1.3.1的环境中,也不能依赖DSL。(导入spark.implicit_不起作用。)


1
你想如何处理空字符串?删除该行吗? - eliasah
4个回答

30

从数据框中删除内容需要使用filter()函数。

newDF = oldDF.filter("colName != ''")

还是我的理解有误?


我该如何使用Where子句编写这个东西? - Shivansh
2
"WHERE colName IS NOT NULL" 或者 "WHERE colName IS NOT EMPTY"...我想是这样的。 - Kristian
5
使用DataFrames/Datasets时,可以使用oldDF.filter($"colName" =!= "")来过滤非空列。不要忘记导入org.apache.spark.sql.functions._org.apache.spark.sql.types._ - Josiah Yoder
也适用于 PySpark! - The Singularity

3

如果有人不想删除空字符串记录,而是将空字符串转换为某个常数值。

val newdf = df.na.replace(df.columns,Map("" -> "0")) // to convert blank strings to zero
newdf.show()

1
你可以使用这个:

df.filter(!($"col_name"===""))

它过滤掉了“col_name”值为空字符串的列。我使用匹配过滤器,然后通过“!”反转它。

2
虽然这段代码可能解决了问题,但加上一个解释关于它是如何解决问题的以及为什么会这样做,将有助于提高您帖子的质量,并可能获得更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请编辑您的回答以添加解释并指出适用的限制和假设。 - Pika Supports Ukraine
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。 - undetected Selenium

0

我也是spark的新手,所以不确定下面提到的代码是否更复杂,但它能够正常工作。

在这里,我们正在创建一个udf,该函数将空值转换为null。

sqlContext.udf().register("convertToNull",(String abc) -> (abc.trim().length() > 0 ? abc : null),DataTypes.StringType);

在上述代码之后,您可以在select子句中使用"convertToNull"(适用于字符串),将所有空白字段设置为null,然后使用.na().drop()。
crimeDataFrame.selectExpr("C0","convertToNull(C1)","C2","C3").na().drop()

注意:您可以在Scala中使用相同的方法。 https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql-udfs.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接