繁体   English   中英

在 Spark Scala API 中检查 Set 中元素是否存在时键入不匹配错误

[英]Type mismatch error on checking presence of element in a Set in Spark Scala API

我定义了以下用 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) 类型不匹配; 发现:Class[T(in value $anonfun)] 其中类型 T(in value $anonfun) <: org.apache.spark.sql.catalyst.plans.logical.LogicalPlan

要求:Class[_>: T(in value operators) with T <: Serializable]

 if(operators .contains(p.getClass))

我认为p.getClass会提供与设置operators期望的相同类型的值。 但好像不是这样。 我是 Scala 和 Spark 的新手,所以我不确定这里到底发生了什么。 谁能帮我解决这个错误?

在这种情况下,问题是类型推断过于精确,您可以通过明确说明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))

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM