我有一个RDD,它的field1包含药物名称,而field2包含该药物的相应剂量。我正在尝试根据保存在一组元组中的多个条件来过滤此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)
}
}
希望这会有所帮助!