Spark Apache没有删除" NULL"值

时间:2017-10-16 14:06:31

标签: csv apache-spark dataframe

我有一个spark脚本,它应该根据从csv文件读取的数据删除数据帧构建中的空值。

这是我的csv文件的样子:

Name,Surname,Age,Class,Categ
John,Snow,30,2nd,NULL
Alfred,Nobel,69,10th,m
Isaac,Newton,55,9th,m

所以,我需要删除每一行,包括" NULL"值。为了达到这个结果,这是我正在写的代码:

rdd = sc.textFile(dataset)
header = rdd.first()
data = rdd.filter(lambda x: x!=header).map(lambda line: line.replace("NULL","").split(","))
columns = header.split(",")
df = spark.createDataFrame(data, columns)
cleanedData = df.na.drop()
cleanedData.coalesce(1).write.option("header", True).option("delimiter", ",").csv('cleanedData')

当我执行我的代码时,它应该返回一个包含以下内容的csv文件:(删除第一行)

Name,Surname,Age,Class,Categ
Alfred,Nobel,69,10th,m
Isaac,Newton,55,9th,m

但我得到的是(只用一个空字符串替换NULL值但不删除该行):

Name,Surname,Age,Class,Categ
John,Snow,30,2nd,
Alfred,Nobel,69,10th,m
Isaac,Newton,55,9th,m

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

当我执行我的代码时,它应该......(删除第一行)

不应该。空字符串与NULL不同。通常,您应该避免使用脆弱的手动解析并使用csv读者指定nullValue

spark.read.option("nullValue", "NULL").option("header", "true").csv(dataset)

但是如果你想坚持你的方法,你应该使用None

lambda line: tuple(x if x != "NULL" else None for x in line.split(","))