scala - 在 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 的新手,所以我不确定这里到底发生了什么。我该如何解决这个错误?
解决方案
在这种情况下,问题是类型推断过于精确,您可以通过明确地说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
inProject.getClass
不是类,而是它的伴生对象,你可能想要classOf[Project]
。
推荐阅读
- node.js - 为什么我无法在 Chrome 中打开 Chrome 选项卡,其 URL:来自 Chrome 启动器的“chrome://inspect”
- c++ - 在二维数组 C++ 中交换行
- reactjs - React useEffect 未触发且布局未更改
- reactjs - React Route 警告:在渲染不同的组件(`Context.Consumer`)时无法更新组件(`App`)
- java - 抛出异常时的 AssertionError Java
- php - 如何在 GET 请求中使用特殊字符?
- ios - 无法分配给属性:“popupHeight”是一个只能获取的属性
- mongodb - 如何修复 findOneAndUpdate?
- sql-server - 为什么 SSMS 告诉我这是一个错误,尽管脚本正在运行
- github - Github Action 触发另一个 repo 更新(push、pull_request)