Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何传递一个Scala UserDefined函数,其中输出是一个复杂类型(使用StructType和StructField),以便从Pyspark中使用_Scala_Apache Spark_Pyspark_Interop_User Defined Functions - Fatal编程技术网

我如何传递一个Scala UserDefined函数,其中输出是一个复杂类型(使用StructType和StructField),以便从Pyspark中使用

我如何传递一个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)} 返回类型是可选的,但如果我省略它,则结

因此,我想创建一个可以在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)}
返回类型是可选的,但如果我省略它,则结果是
[]
(一个空列表)

那么…我如何在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???>)