Scala:具有一组元组指定的不同条件的过滤器

问题描述 投票:0回答:1

我有一个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 apache-spark rdd
1个回答
0
投票

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

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.