我正在尝试学习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。
从研究中我了解到它无法识别返回,因为单位意味着无效。有人可以帮助我。
答案 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
涵盖所有可能的情况。
如果要完全避免不以H
或I
开头的字符串,请使用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)