scala - Scala:使用集合中元组指定的不同条件进行过滤
问题描述
我有一个 RDD,它的字段 1 包含药物名称,字段 2 包含该药物的相应剂量。我正在尝试根据保存在一组元组中的多个标准来过滤此 RDD,例如:
val MyCriteria = Set(("drug a", ">", 1.2), ("drug b", ">=", 4.5), ("drug c", "<", 6.3))
我想我能做的是:
val rslt = rdd.filter(x => MyCriteria.foreach(x.field1 == _._1 && x.field2 _._2 _._3))
但我不知道如何将元组(字符串)的第二个元素转换为 scala 理解的实际运算符。它抛出一条错误消息:
<console>:1: error: ')' expected but '.' found.
val rslt = rdd.filter(x => MyCriteria.foreach(x.field1 == _._1 && x.field2 _._2 _._3))
^
或者什么是实现过滤器的更好方法?
解决方案
它不会像这样工作,Scala 字符串文字不会被翻译成运算符。相反,您需要使用函数将 RDD 中的值与过滤器结果进行比较。
请看下面的代码示例:
type Compare[T : Numeric] = (T, T) => Boolean
type DoubleCompare = Compare[Double]
val > : DoubleCompare = _ > _
val < : DoubleCompare = _ < _
val >= : DoubleCompare = _ >= _
val myCriteria: Set[(String, DoubleCompare, Double)] = Set (
("drug a", > , 1.2),
("drug b", >=, 4.5),
("drug c", <, 6.3)
)
rdd.filter { x =>
val fieldName = x.field1
val fieldValue = x.field2
myCriteria.foreach {
case (filterFieldName, filter, filterValue) =>
(fieldName == filterFieldName) && filter(fieldValue, filterValue)
}
}
希望这可以帮助!
推荐阅读
- synchronization - 将文件夹与 tif 和 pdf 同步
- c++ - C++创建临时对象来调用成员函数
- stimulusjs - 刺激:控制器上下文中的 this.application 属性
- rust - 如何知道我的指针不会被释放?
- vue.js - 在 vue 中提交后更改我的价格
- python - 如何使用python for循环读取excel中的单元格?
- angular - Angular NgXs - 动作被触发另一个动作
- python - 我们如何运行 2 个并行共享公共变量的 python 脚本?
- javascript - 网页上显示新元素时更新数组
- python - Python 存根文件的良好实践