Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何发出元组而不是元组列表_Scala_Scalding - Fatal编程技术网

Scala 如何发出元组而不是元组列表

Scala 如何发出元组而不是元组列表,scala,scalding,Scala,Scalding,我有一份非常棘手的工作,看起来像这样: 导入com.twitter.spothing.{Args,Csv,Job,TextLine} class DataJob(args: Args) extends Job(args) { val input = args("input") val output = Csv(args("output"), separator = ",") def parseLine(x: String):Seq[(String, String, String,

我有一份非常棘手的工作,看起来像这样:

导入com.twitter.spothing.{Args,Csv,Job,TextLine}

class DataJob(args: Args) extends Job(args) {

  val input = args("input")
  val output = Csv(args("output"), separator = ",")

  def parseLine(x: String):Seq[(String, String, String, String)] = {
    List(("a", "b", "c", "d")) //Returns a list, not a tuple
  }

  TextLine(input).mapTo('line -> ('v1, 'v2, 'v3, 'v4)) {
  x:String => {
    parseLine(x) // this code fails with arity error
  }
  }.write(Csv(args("output")))
}
当它运行时,我得到以下错误:

Caused by: java.lang.AssertionError: assertion failed: Arity of (class com.twitter.scalding.LowPriorityTupleSetters$$anon$2) is 1, which doesn't match: + ('v1', 'v2', 'v3', 'v4')

这是因为我的
parseLine
函数返回一个元组列表,但代码希望发出一个元组。我如何才能使此代码正常工作?

好的,看起来我只需要更改:

TextLine(input.mapTo('line->('v1,'v2,'v3,'v4))

致:

TextLine(input).flatMap('line->('v1,'v2,'v3,'v4))


仍然不清楚原因,因此任何回复都将不胜感激

顾名思义,flatMap将其参数展平。因此,在前面的输入中,您有一个行列表(Textline(input)),它处理一个列表(list(tuples))。通过展平,您可以得到一个列表(元组),这就是您想要的。或者,您可以将parseLine更改为直接返回(“a”、“b”、“c”、“d”)而不是列表(“a”、“b”、“c”、“d”),并且它也应该可以工作(并且可能会稍微更有效,因为您避免了一些指针分配)。