首页 > 解决方案 > 在 Spark Scala API 中检查 Set 中是否存在元素时出现类型不匹配错误

问题描述

我已经定义了以下用 Scala 编写的函数,用于确定特定类型的节点(项目、过滤器)是否包含在给定的集合中:

private val operators = Set(Project.getClass,Filter.getClass)    
def containsNode(plan: Seq[LogicalPlan]):Boolean=
    {
     for(p<- plan)
       {
         if(operators.contains(p.getClass))
           true
       }
  false
}

运行代码时,上述函数出现以下错误:

错误:(182, 36) 类型不匹配;发现:类[T(价值$anonfun)]其中类型T(价值$anonfun)<:org.apache.spark.sql.catalyst.plans.logical.LogicalPlan

必需:Class[_ >: T(in value operator) with T <: Serializable]

if(operators .contains(p.getClass))

我认为p.getClass会给出与预期相同类型的值operators。但它似乎不像。我是 Scala 和 Spark 的新手,所以我不确定这里到底发生了什么。我该如何解决这个错误?

标签: scalaapache-sparkapache-spark-sql

解决方案


在这种情况下,问题是类型推断过于精确,您可以通过明确地说operators是一组任何类来解决它:

private val operators = Set[Class[_]](Project.getClass,Filter.getClass)

尽管第二个问题是true像这样使用不会像您可能想要的那样返回它。您可以显式编写return true但更好地使用exists已经包含所需逻辑的代码:

def containsNode(plan: Seq[LogicalPlan]): Boolean =
    plan.exists(p => operators.contains(p.getClass))

编辑:第三个可能的问题是ProjectinProject.getClass不是类,而是它的伴生对象,你可能想要classOf[Project]


推荐阅读