2017-10-16 59 views
0

我有一個火花腳本,應該刪除數據幀構建基礎上的空值從csv文件讀取的數據。Spark Apache沒有刪除「NULL」值

這是我的csv文件怎麼看起來像:

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

所以,我需要刪除每行包括「NULL」值。爲了達到這個效果,這個我wrinting代碼:

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

當我執行我的代碼,它應該... ...(除去第一行)

它不應該。空字符串與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(","))