使用Scala查找以H或I开头的行时出错

时间:2017-03-18 16:37:18

标签: scala

我正在尝试学习Spark和Scala。我正在开发一个方案来识别以H或I开头的行。下面是我的代码

def startWithHorI(s:String):String=
{
 if(s.startsWith("I")
 return s
 if(s.startsWith("H")
 return s
}

val fileRDD=sc.textFile("wordcountsample.txt")
val checkRDD=fileRDD.map(startWithHorI)
checkRDD.collect

在创建函数Found时抛出错误:Unit Required:Boolean。

从研究中我了解到它无法识别返回,因为单位意味着无效。有人可以帮助我。

3 个答案:

答案 0 :(得分:1)

你的def有一些问题,我们将从那里开始: 它抛出了错误,因为根据发布的代码,您的语法不完整并且def定义不正确:

def startWithHorI(s:String): String=
{
 if(s.startsWith("I")) // missing extra paren char in original post
 s // do not need return statement
 if(s.startsWith("H")) // missing extra paren char in original post
 s // do not need return statement
}

这仍然会返回错误,因为当编译器发现它返回String时,我们期待Any。如果我们没有其他情况(当s不以H或I开头时会返回什么?)我们不能这样做 - 编译器会将此视为Any返回类型。对此的更正将是具有最终返回String的其他条件。

def startWithHorI(s: String): String = {
 if(s.startsWith("I")) s else "no I" 
 if(s.startsWith("H")) s else "no H"
}

如果您不想返回任何内容,那么Option值得查看返回类型。

最后,我们可以通过过滤器实现您正在做的事情 - 无需使用def:

进行映射
val fileRDD = sc.textFile("wordcountsample.txt")
val checkRDD = fileRDD.filter(s => s.startsWith("H") || s.startsWith("I"))
checkRDD.collect

答案 1 :(得分:0)

将任何功能传递给rdd.map(fn)时,请确保fn涵盖所有可能的情况。

如果要完全避免不以HI开头的字符串,请使用flatMap并从函数中返回Option [String]。 例如:

def startWithHorI(s:String): Option[String]=
{
    if(s.startsWith("I") || s.startsWith("H")) Some(s)
    else None
}

然后,

sc.textFile("wordcountsample.txt").flatMap(startWithHorI)

这将删除所有不以H或I开头的行。

通常,为了最大限度地减少运行时错误,请尝试创建total functions来处理所有可能的参数值。

答案 2 :(得分:0)

下面的内容会对你有用吗?

val fileRDD=sc.textFile("wordcountsample.txt")
fileRDD.collect
Array[String] = Array("Hello ", Hello World, Instragram, Good Morning)


val filterRDD=fileRDD.filter( x=> (x(0) == 'H'||x(0) == 'I'))
filterRDD.collect()
Array[String] = Array("Hello ", Hello World, Instragram)