从PySpark DataFrame中删除NULL,NAN,空格

Sum*_*mit 1 apache-spark pyspark apache-spark-1.6

我在PySpark中有一个包含空格,Null和Nan的数据帧.我想删除任何有这些行的行.我尝试了以下命令,但似乎没有任何工作.

myDF.na.drop().show()
myDF.na.drop(how='any').show()
Run Code Online (Sandbox Code Playgroud)

以下是数据帧:

+---+----------+----------+-----+-----+
|age|  category|      date|empId| name|
+---+----------+----------+-----+-----+
| 25|electronic|17-01-2018|  101|  abc|
| 24|    sports|16-01-2018|  102|  def|
| 23|electronic|17-01-2018|  103|  hhh|
| 23|electronic|16-01-2018|  104|  yyy|
| 29|       men|12-01-2018|  105| ajay|
| 31|      kids|17-01-2018|  106|vijay|
|   |       Men|       nan|  107|Sumit|
+---+----------+----------+-----+-----+
Run Code Online (Sandbox Code Playgroud)

我错过了什么?解决NULL,Nan或空格的最佳方法是什么,以便在实际计算中没有问题?

hi-*_*zir 5

NaN(不是数字)具有不同的含义,NULL空字符串只是一个正常值(可以使用csv reader自动转换为NULL),因此na.drop不匹配这些.

您可以将all转换为null和drop

from pyspark.sql.functions import col, isnan, when, trim

df = spark.createDataFrame([
    ("", 1, 2.0), ("foo", None, 3.0), ("bar", 1, float("NaN")), 
    ("good", 42, 42.0)])

def to_null(c):
    return when(~(col(c).isNull() | isnan(col(c)) | (trim(col(c)) == "")), col(c))


df.select([to_null(c).alias(c) for c in df.columns]).na.drop().show()
# +----+---+----+
# |  _1| _2|  _3|
# +----+---+----+
# |good| 42|42.0|
# +----+---+----+
Run Code Online (Sandbox Code Playgroud)

  • 因为a)空或空字符串不是NULL,b)NaN不是NULL.空字符串甚至不相关,NaN具有与NULL不同的含义. (3认同)