烫伤:需要根据参数以不同的文件格式读取

时间:2015-01-28 18:47:32

标签: scala scalding

我正在尝试在脚本上创建,该脚本将以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>

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

1 个答案:

答案 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
  }
}