【问题标题】:Scalding: Cannot reduce with partial function烫伤:不能用偏函数减少
【发布时间】:2016-11-16 12:09:14
【问题描述】:

我正在使用 scalding 来做一些简单的字数统计类型的事情。使用部分函数扩展元组时出现错误。确切的错误信息是:

Error:(15, 14) missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: (?, ?) => ?
      .reduce{ case ((t1, v1), (t2, v2)) =>
             ^

向元组添加类型也无济于事。我做错了什么?

TypedPipe.from(PackedAvroSource[TrackPlay](args("input")))
  .map({ t => (t.getTrackId.toString, 1) })
  .groupBy(_._1)
  .reduce{ case ((t1, v1), (t2, v2)) =>
      (t1, v1 + v2)
  }
  .values
  .write(TypedTsv[(CharSequence, Int)](args("output")))

【问题讨论】:

    标签: scala types reduce scalding


    【解决方案1】:

    您需要指定类型,因为编译器无法推断出正确的类型:

    .reduce[(String, Int)] { case ((t1, v1), (t2, v2)) => (t1, v1 + v2) }
    

    类型指定为[U >: Tuple2[String, Int]],因此编译器推断Tuple2[Any, Any],因此无法计算预期的结果类型Tuple2[String, Int]

    第 8.5 节中有关此内容的更多信息:http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf


    附带说明一下,您的整体逻辑的一个更简单的实现是:

    TypedPipe.from(PackedAvroSource[TrackPlay](args("input")))
      .map(t => (t.getTrackId.toString, 1))
      .group
      .sum
      .toTypedPipe
      .write(TypedTsv[(CharSequence, Int)](args("output")))
    

    【讨论】:

    • 你没有回答为什么我的方法行不通。您应该能够使用 case 语句来扩展元组。有很多方法可以做到这一点,我只想知道为什么 reduce with case 语句不起作用。谢谢!
    • 我想知道为什么它在不使用 case 语句的情况下工作。非常混乱。
    猜你喜欢
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多