Во-первых, как сказал @ Эндрю , плохая идея использовать Dynami c sql без особой причины из-за неопределенного поведения и трудностей в отладке. Предположим, что вы объединили значения с оператором dataframe, тогда вы можете использовать этот код:
import spark.implicits._
val appData: DataFrame = Seq(
("1", ">"),
("1", ">"),
("3", "<="),
("4", "<>"),
("6", ">="),
("6", "==")
).toDF("value", "operator")
val attr = 5
def compare(value: String, operator: String, sample: Int): String = {
val isValueCorrectForAttr: Boolean = operator match {
case ">" => value.toInt > sample
case "<" => value.toInt < sample
case ">=" => value.toInt >= sample
case "<=" => value.toInt <= sample
case "==" => value.toInt == sample
case "<>" => value.toInt != sample
case _ => throw new IllegalArgumentException(s"Wrong operator: $operator")
}
if (isValueCorrectForAttr) "GOOD" else "BAD"
}
import org.apache.spark.sql.functions._
val dynamic_compare = spark.udf.register("dynamic_compare", (v: String, op: String) => compare(v, op, attr))
appData.withColumn("result", dynamic_compare(col("value"), col("operator")))
, если у вас нет столбца оператора и только один оператор, это может быть проще:
import spark.implicits._
val appData: DataFrame = Seq(
"1",
"1",
"3",
"4",
"6",
"6"
).toDF("value")
val attr = 5
val op = ">"
def compare(value: String, operator: String, sample: Int): String = {
val isValueCorrectForAttr: Boolean = operator match {
case ">" => value.toInt > sample
case "<" => value.toInt < sample
case ">=" => value.toInt >= sample
case "<=" => value.toInt <= sample
case "==" => value.toInt == sample
case "<>" => value.toInt != sample
case _ => throw new IllegalArgumentException(s"Wrong operator: $operator")
}
if (isValueCorrectForAttr) "GOOD" else "BAD"
}
import org.apache.spark.sql.functions._
val dynamic_compare = spark.udf.register("dynamic_compare", (value: String) => compare(value, op, attr))
appData.withColumn("result", dynamic_compare(col("value")))