我正在尝试在脚本上创建,该脚本将以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语句中抛出了一个错误,但是当它找到“unit”类型并期待RichPipe时,我无法弄清楚它正在尝试读取的内容。 / p>
或者,如果有更好的方法可以解决这个问题,请自由建议。
答案 0 :(得分:1)
这是一个固定版本:
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") }
问题是:您错过了定义中的=
符号,并使用了if
而没有else
(导致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
}
}