2017-10-13 232 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