【问题标题】:Scala Type MisMatch Error in sparkspark中的Scala类型不匹配错误
【发布时间】:2015-11-02 16:02:42
【问题描述】:

我创建了以下函数:

 def mapToPers(inTuple: (String, String, String), 
               v: ((Double, Double, Double, Double, Double),
                   Map[Double,
                       (Double, Double, Double, Double, Double)])) = {

      val (prod: String, market: String, week: String) = inTuple
      val result = for (cumePeriod <- cumePeriods) yield {
        val (per, weekList) = cumePeriod
        if (weekList.contains(week)) ((prod, market, per), v)        
  }
 result
}

当我调用它时,它会给出类型不匹配的错误:

描述资源路径位置类型类型不匹配;成立 : ((字符串,字符串,字符串),((双,双,双,双,双), 地图[双,(双,双,双,双,双)]))=> scala.collection.immutable.Iterable[Any] 必需:(((String, String, String), ((Double, Double, Double, Double, Double), 地图[双,(双,双,双,双,双)])))=> TraversableOnce[?]

【问题讨论】:

  • 请问println(inTuple)println(cumePeriods) 的输出是什么。还有v是从哪里来的?
  • cumePeriods 的类型是什么?
  • 与其创建如此疯狂的元组,不如为每个元组创建单独的case class。更容易修复/调查错误。

标签: scala


【解决方案1】:

你显然有嵌套元组的问题。检查括号:

找到:

(
  (String, String, String), 
  (
    (Double, Double, Double, Double, Double), 
    Map[Double,(Double, Double, Double, Double, Double)]
  )
) => scala.collection.immutable.Iterable[Any] 

必填:

(
  (
    (String, String, String), 
    (
      (Double, Double, Double, Double, Double), 
      Map[Double,(Double, Double, Double, Double, Double)]
    )
  )
) => TraversableOnce[?]

所以我又看到了一层嵌套。鉴于非常混乱的类型很难发现,我建议您在这里使用一些案例类。

编辑:顺便说一句,我发现了别的东西。您正在使用的 if 没有 else,因此 for 理解将不知道要准确生成什么。您可能只想在检查后让步:

val result = for { 
  (per, week_list) <- cumePeriods
  if week_list.contains(week)
}
  yield ((prod, market, per), v)

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多