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()