0

我正在尝试在脚本上创建,该脚本将以 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 时,我无法弄清楚它试图读取什么。

或者,如果有更好的方法来解决这个问题,请自由提出建议。

4

1 回答 1

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
  }
}
于 2015-01-28T19:46:25.200 回答