如何基于if条件跳过spark rdd map动作中的行

时间:2016-05-23 07:56:24

标签: scala apache-spark apache-spark-mllib

我有一个文件,我想把它交给一个mllib算法。所以我跟着这个例子做了类似的事情:

val data = sc.textFile(my_file).
    map {line =>

        val parts = line.split(",");
        Vectors.dense(parts.slice(1, parts.length).map(x => x.toDouble).toArray)
};

这是有效的,但有时我有一个缺失的功能。有时,某行中的一列没有任何数据,我想扔掉这样的行。

所以我想做这样的事情map{line => if(containsMissing(line) == true){ skipLine} else{ ... //same as before}}

我该怎么做skipLine动作?

3 个答案:

答案 0 :(得分:1)

您可以使用filter功能过滤掉这些行:

val data = sc.textFile(my_file)
   .filter(_.split(",").length == cols)
   .map {line =>
        // your code
   };

假设变量cols包含有效行中的列数。

答案 1 :(得分:1)

您可以使用flatMap,Some和None:

def missingFeatures(stuff): Boolean = ??? // Determine if features is missing

val data = sc.textFile(my_file)
  .flatMap {line =>
    val parts = line.split(",");
    if(missingFeatures(parts)) None
    else Some(Vectors.dense(parts.slice(1, parts.length).map(x => x.toDouble).toArray))
};

这样可以避免多次映射rdd。

答案 2 :(得分:0)

Java代码可跳过Spark RDD中的空行/标头:

首先导入:

nameOverride

现在,过滤器将总数列与以VendorID开头的17列或标题列进行比较。

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;