Scala 如何在Spark中动态创建自定义项?

Scala 如何在Spark中动态创建自定义项?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个DataFrame,我想在其中动态创建多个udf,以确定某些行是否匹配。我现在只是测试一个例子。我的测试代码如下所示 //create the dataframe import spark.implicits._ val df = Seq(("t","t"), ("t", "f"), ("f", "t"), ("f", "f")).toDF("n1", "n2") //create the scala function def filter(v1: Seq[Any], v2: Seq[

我有一个
DataFrame
,我想在其中动态创建多个udf,以确定某些行是否匹配。我现在只是测试一个例子。我的测试代码如下所示

//create the dataframe
import spark.implicits._
val df = Seq(("t","t"), ("t", "f"), ("f", "t"), ("f", "f")).toDF("n1", "n2")

//create the scala function
def filter(v1: Seq[Any], v2: Seq[String]): Int = {
  for (i <- 0 until v1.length) {
    if (!v1(i).equals(v2(i))) {
      return 0
    }
  }
  return 1
}

//create the udf
import org.apache.spark.sql.functions.udf
val fudf = udf(filter(_: Seq[Any], _: Seq[String]))

//apply the UDF
df.withColumn("filter1", fudf(Seq($"n1"), Seq("t"))).show() 
lit()中加上“t”

尝试在
sqlContext
上注册UDF


不确定您在这里要完成什么,列中的条目是字符串,没有顺序基本上,我正在尝试创建一个UDF,它包含任意数量的列(例如,
$“n1”
$“n2”
,…,
$“n10”
)和值(例如,“t”,“f”,“t”),并在UDF内部,查看是否
n1=“t”和n2=“f” ... n10=“t”
。这种类型的“过滤”可以很容易地用
df串行完成。其中(“n1='t'和n2='f'…和n10='t')。count
但是这种方法是不可并行的,每次产生火花动作时,此类过滤器都必须按顺序运行。您能展示一个具有任意数量列和lit的示例吗?
Seq(lit(“t”),lit(“f”)
。如果我们不对字符串使用
lit
,它将被视为coulmn名称。 :30: error: not found: value df df.withColumn("filter1", fudf($"n1", Seq("t"))).show() ^ :30: error: type mismatch; found : Seq[String] required: org.apache.spark.sql.Column df.withColumn("filter1", fudf($"n1", Seq("t"))).show() ^
import spark.implicits._
val df = Seq(("t","t"), ("t", "f"), ("f", "t"), ("f", "f")).toDF("n1", "n2")

import org.apache.spark.sql.functions.udf
val fudf = udf( (x: String) => if (x.equals("t")) 1 else 0)

var df2 = df
for (i <- 0 until 10000) {
  df2 = df2.withColumn("filter"+i, fudf($"n1"))
}
df.withColumn("filter1", fudf($"n1", Seq(lit("t")))).show()