我需要将制表符分隔文件加载到Spark Context中。但是有些字段缺少值,我需要过滤掉这些行。我使用以下代码。但是,如果字段完全丢失(例如行中少一个选项卡),则此代码会抛出异常。有什么更好的方法来实现这一目标?
val RDD = sc.textFile("file.txt").map(_.split("\t"))
.filter(_(0).nonEmpty)
.filter(_(1).nonEmpty)
.filter(_(2).nonEmpty)
.filter(_(3).nonEmpty)
.filter(_(4).nonEmpty)
.filter(_(5).nonEmpty)
答案 0 :(得分:1)
我发现这适用于大型数据集:
val allRecords: RDD[Either[(String, String, String, String), Array[String]]] = sc.textFile(s"file.txt")
.map(x=>x.split("\t"))
.map {
case Array(name, address, phone, country) => Left(name, address, phone, country)
case badArray => Right(badArray)
}
val goodRecords = allRecords.collect{ case Left(r) => r }
答案 1 :(得分:0)
您可以将文件作为数据框读取,然后使用DataFrameNaFunctions
val df = sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load("file.txt")
val cleanDF = df.na.drop()
Here是Spark-csv库的链接,以防万一。