2017-10-13 77 views
0

我從csv文件中加載了一個RDD。但是,該文件包含無效數據。所以,當我試圖輸出這個RDDfirst的聯繫人。唯一的例外是如何刪除RDD中的所有記錄,包括null?

產生的原因:java.lang.NumberFormatException:空字符串

我希望找到解決辦法來去除RDD的所有記錄,當一個記錄包括空字符串。另外,這個RDD包含很多領域,所以很難一一處理每個領域。我記得DataFrame有這樣的功能,比如na.drop()。我需要這種功能適用於RDD

我使用的代碼是這樣的:

//using case class 
case class Flight(dest_id:Long, dest:String, crsdeptime:Double, deptime:Double, depdelaymins:Double, crsarrtime:Double) 

//defining function 
def parseFlight(str: String): Flight = { 
    val line = str.split(",") 
    Flight(line(0), line(1), line(2), line(3), line(4).toInt, line(5).toLong) 
} 

//loading data 
val textRDD = sc.textFile("/root/data/data.csv") 
val flightsRDD = textRDD.map(parseFlight) 

更新

當我使用RDD通過DateFrame轉換。我發現RDD的每一行都是Row對象。如何提取一行的某些字段來構建Edge對象?

+0

爲什麼只有RDD?爲什麼不是數據框? – mrsrinivas

+0

我正在建立RDD圖。 –

回答

1

如果csv文件頭的情況下,類變量名稱相匹配,那麼它更容易讀取數據的數據幀,然後使用na.drop()

val flightsDf = spark.read 
    .option("header", "true") 
    .option("inferSchema", "true") 
    .csv("/root/data/data.csv") 
    .na.drop() 
    .as[Flight] 

如果你想有一個RDD,總是可以將其與flightsDf.rdd後轉換。

+0

我發現這個rdd的每一行都是一個Row對象。如何從此行提取字段? –

+0

@IvanLee最簡單的解決方法是改變'na.drop()'和'as [Flight]'的順序,我改變了上面的答案以遵循這一點。而不是Row對象,你應該有一個'RDD [Flight]'。 – Shaido

相關問題