我如何传递一个Scala UserDefined函数,其中输出是一个复杂类型(使用StructType和StructField),以便从Pyspark中使用
因此,我想创建一个可以在Pyspark中使用的scala UDF。 我想要的是接受字符串列表为我如何传递一个Scala UserDefined函数,其中输出是一个复杂类型(使用StructType和StructField),以便从Pyspark中使用,scala,apache-spark,pyspark,interop,user-defined-functions,Scala,Apache Spark,Pyspark,Interop,User Defined Functions,因此,我想创建一个可以在Pyspark中使用的scala UDF。 我想要的是接受字符串列表为x,字符串列表为y和 获取所有字符串组合 所以如果我有x=[“a”,“b]和y=[“a”,“b”],我希望输出是out=[[a,a],[a,b],[b,a],[b,b]] 我设法编写的Scala代码非常简单 (x: Seq[String], y: Seq[String]) => {for (a <- x; b <-y) yield (a,b)} 返回类型是可选的,但如果我省略它,则结
x
,字符串列表为y
和
获取所有字符串组合
所以如果我有x=[“a”,“b]和y=[“a”,“b”],我希望输出是out=[[a,a],[a,b],[b,a],[b,b]]
我设法编写的Scala代码非常简单
(x: Seq[String], y: Seq[String]) => {for (a <- x; b <-y) yield (a,b)}
返回类型是可选的,但如果我省略它,则结果是[]
(一个空列表)
那么…我如何在pyspark中实际使用这个scala UDF呢
我意识到可能会有很多事情出错,因此试图尽我所能描述整个设置。DualArrayExplode的声明是
class DualArrayExplode扩展了UDF2[Seq[String],Seq[String],UserDefinedFunction]
这意味着声明一个udf,它以两个字符串序列作为输入并返回一个udf
class DualArrayExplode扩展UDF2[Seq[String],Seq[String],Seq[(String,String)]]{
覆盖def调用(x:Seq[String],y:Seq[String]):Seq[(String,String)]={
//(工作节点内容)
为了
import org.apache.spark.sql.types._
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.api.java.UDF2
import org.apache.spark.sql.api.java.UDF1
class DualArrayExplode extends UDF2[Seq[String], Seq[String], UserDefinedFunction] {
override def call(x: Seq[String], y: Seq[String]):UserDefinedFunction = {
// (worker node stuff)
val DualArrayExplode = (x: Seq[String], y: Seq[String]) => {for (a <- x; b <-y) yield (a,b)}
val DualArrayExplodeUDF = (udf(DualArrayExplode))
return DualArrayExplodeUDF
}
}
object DualArrayExplode {
def apply(): DualArrayExplode = {
new DualArrayExplode()
}
}
spark.udf.registerJavaFunction('DualArrayExplode',
'blah.blah.blah.blah.blah.DualArrayExplode', <WHAT_TYPE_HERE???>)