首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalding:需要根据参数读取不同的文件格式

Scalding:需要根据参数读取不同的文件格式
EN

Stack Overflow用户
提问于 2015-01-29 02:47:32
回答 1查看 293关注 0票数 0

我正在尝试在脚本上创建管道,该脚本将从avro格式的文件创建管道,或者基于命令行中作为参数传递的值进行分隔。然后,我想要使用该管道并对其执行一些操作。到目前为止,我得到的是:

代码语言:javascript
复制
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, ....)

这会产生一个错误,说明:

代码语言:javascript
复制
error: type mismatch;
found   : Unit
required: com.twitter.scalding.RichPipe
else if (types == "delim") {
     ^
one error found

它似乎在else if语句上抛出了一个错误,这是没有意义的,但是当它发现一个“单元”类型并期望RichPipe时,我不知道它试图读取的是什么。

或者,如果有更好的方法,请随时提出建议。

EN

回答 1

Stack Overflow用户

发布于 2015-01-29 03:46:25

下面是一个固定的版本:

代码语言:javascript
复制
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") }

问题是:您在定义中遗漏了一个=符号,并且使用了不带elseif (这将导致Unit)。

或者,您也可以使用模式匹配,例如:

代码语言:javascript
复制
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
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28200031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档