首页 > 解决方案 > 基于用户输入的过滤条件 Spark Scala

问题描述

我必须根据用户输入应用过滤条件。假设以下条件和“mod”是用户过滤条件字符串输入。

df.filter(df("rollnumber").mod(2))

如何编写一个将参数作为 filtercolumnname、filtercondition、filtervalue 的函数并将其应用于数据框?

期待:

def applyfiltering(filtercolumnname: String,filtercondition : String,filtervalue : String) ={

df.filter(df("rollnumber").mod(2))

}

applyfiltering("rollnumber","mod","2")

提前致谢

我只是这样尝试:

df.filter(df("rollnumber").cast("===")(2)).toDF
df.filter(df("rollnumber").cast("mod")(2)).toDF

标签: scalaapache-sparkuser-defined-functionsscala-collections

解决方案


如果有一组已知的用户可以要求做的事情,您可以执行以下操作:

val cond1 = df1("rollnumber").mod(lit(2))
val cond2 = df1("rollnumber") === lit(2)

def applyFiltering(column: Column): Unit = {
  df1.filter(column)
}

applyFiltering(cond2).show

另一种方法是:

def applyFiltering(colName: String, filtercondition: String, filtervalue: Any): DataFrame = {
  val dfCol = df1(colName)
  val fltValue = lit(filtervalue)
  val flt: Column =
    if (filtercondition == "===")  dfCol === fltValue 
    else if (filtercondition == "mod") dfCol.mod(fltValue)
    else throw new UnsupportedOperationException()

  df1.filter(flt)
}

applyFiltering("rollnumber", "===", 2)

推荐阅读