在将文本文件加载到Spark上下文时,跳过缺少字段的行

时间:2016-08-09 17:41:02

标签: scala apache-spark tab-delimited tab-delimited-text

我需要将制表符分隔文件加载到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)

2 个答案:

答案 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库的链接,以防万一。