首页 > 解决方案 > 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))
                                                                                ^

或者什么是实现过滤器的更好方法?

标签: scalaapache-sparkrdd

解决方案


它不会像这样工作,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)
    }
}

希望这可以帮助!


推荐阅读