我正在尝试在脚本上创建管道,该脚本将从avro格式的文件创建管道,或者基于命令行中作为参数传递的值进行分隔。然后,我想要使用该管道并对其执行一些操作。到目前为止,我得到的是:
val fileType = args("file_type").toString
def makeFile (types:String):RichPipe {
if (types == "avro") {UnpackedAvroSource(args("input")).addTrap(Tsv("errorFile.txt"))}
else if (types == "delim") {Csv(args("input"), separator = "\t", fields = schema).addTrap(Tsv(errors)) }
val fileSource = makeFile(fileType)
fileSource
.project('field1, 'field2, ....)这会产生一个错误,说明:
error: type mismatch;
found : Unit
required: com.twitter.scalding.RichPipe
else if (types == "delim") {
^
one error found它似乎在else if语句上抛出了一个错误,这是没有意义的,但是当它发现一个“单元”类型并期望RichPipe时,我不知道它试图读取的是什么。
或者,如果有更好的方法,请随时提出建议。
发布于 2015-01-29 03:46:25
下面是一个固定的版本:
def makeFile (types:String):RichPipe = {
if (types == "avro") {UnpackedAvroSource(args("input")).addTrap(Tsv("errorFile.txt"))}
else if (types == "delim") {Csv(args("input"), separator = "\t", fields = schema).addTrap(Tsv(errors))}
else {sys.error(s"Wrong type: $types") }问题是:您在定义中遗漏了一个=符号,并且使用了不带else的if (这将导致Unit)。
或者,您也可以使用模式匹配,例如:
def makeFile (types:String):RichPipe = {
types matches {
case "avro" => {
UnpackedAvroSource(args("input")).addTrap(Tsv("errorFile.txt"))
}
case "delim" => {
Csv(args("input"), separator = "\t", fields = schema).addTrap(Tsv(errors))
}
case _=> sys.error(s"Wrong type: $types") //Optional if you are ok with MatchError
}
}https://stackoverflow.com/questions/28200031
复制相似问题