我有一个文件,我想把它交给一个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动作?
答案 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;