Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Spark Scala API中检查集合中是否存在元素时出现类型不匹配错误_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

在Spark Scala API中检查集合中是否存在元素时出现类型不匹配错误

在Spark Scala API中检查集合中是否存在元素时出现类型不匹配错误,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我定义了以下用Scala编写的函数,用于确定特定类型的节点(项目、过滤器)是否包含在给定的集合中: private val operators = Set(Project.getClass,Filter.getClass) def containsNode(plan: Seq[LogicalPlan]):Boolean= { for(p<- plan) { if(operators.contains(p.getClass))

我定义了以下用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
}

我认为
p.getClass
将给出与设置
运算符所期望的值相同的类型。但似乎不是这样。我是Scala和Spark的新手,所以我不确定这里到底发生了什么。有人能帮我修复这个错误吗?

在这种情况下,问题是类型推断太精确,您可以通过明确地说
操作符
是任何类的集合来修复它:

private val operators = Set[Class[_]](Project.getClass,Filter.getClass)
尽管第二个问题是,像那样仅仅使用
true
并不会像您可能想要的那样返回它。您可以显式写入
返回true
,但最好使用已包含所需逻辑的
exists

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

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

在这种情况下,问题是太精确的类型推断,您可以通过明确地说
操作符
是任何类的集合来修复它:

private val operators = Set[Class[_]](Project.getClass,Filter.getClass)
尽管第二个问题是,像那样仅仅使用
true
并不会像您可能想要的那样返回它。您可以显式写入
返回true
,但最好使用已包含所需逻辑的
exists

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

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

您所说的“太精确的类型推断”是什么意思
Project.getClass
Filter.getClass
的公共超类型不是
Class[\u]
,因为
Project
Filter
有一个公共超类型。什么叫“太精确的类型推断”?
Project.getClass
Filter.getClass
的公共超类型不是
Class因为
Project
Filter
有一个共同的超类型。