如何删除包含null的RDD中的所有记录?

时间:2017-10-13 01:41:04

标签: scala csv apache-spark rdd

我从csv文件加载了RDD。但是,此文件包含无效数据。因此,当我尝试输出此RDDfirst的联系人时。

是个例外
  

引起:java.lang.NumberFormatException:empty String

我希望找到解决方案,当一条记录包含空字符串时,删除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)

更新

当我使用由DateFrame转换的RDD时。我发现RDD的每一行都是Row对象。如何提取一行的某些字段来构建Edge对象?

1 个答案:

答案 0 :(得分: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转换它。