[英]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.