Arrays ApacheSpark:等列数据结构,UDF函数的不同结果

Arrays ApacheSpark:等列数据结构,UDF函数的不同结果,arrays,scala,apache-spark,spark-dataframe,Arrays,Scala,Apache Spark,Spark Dataframe,我有两列数组 arrayColumns1: org.apache.spark.sql.Column = array("col1","col2") arrayColumns2: org.apache.spark.sql.Column = array("col1","col2") 两者似乎都是平等的,但他们来自不同的来源 arrayColumns1是从数组(“col1”、“col2”)到数组的转换,使用以下函数: def asLitArray[T](xs: Seq[T]) = array(xs

我有两列数组

arrayColumns1: org.apache.spark.sql.Column = array("col1","col2")
arrayColumns2: org.apache.spark.sql.Column = array("col1","col2")
两者似乎都是平等的,但他们来自不同的来源

  • arrayColumns1
    是从
    数组(“col1”、“col2”)
    数组的转换,使用以下函数:

    def asLitArray[T](xs: Seq[T]) = array(xs map lit: _*)
    
    .withColumn("udfFunction",udfFunction(arrayColumns))
    
  • arrayColumns2
    是从编写文本数组开始的

现在,当我尝试使用
arrayColumns1
作为UDF函数的输入时:

def asLitArray[T](xs: Seq[T]) = array(xs map lit: _*)
.withColumn("udfFunction",udfFunction(arrayColumns))
在哪里

val udfFunction= udf(
  { xs : Seq[Double] => 

    DO_SOMETHING
    (output)
  }
)
它告诉我这个错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'UDF(array(col1,col2))' due to data type mismatch: argument 1 requires array<double> type, however, 'array('col1','col2')' is of array<string> type.;;
org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析“UDF(数组(col1,col2))”:参数1需要数组类型,但是,“数组('col1','col2')是数组类型。;;
但是当我使用
arrayColumns2
时,它工作得很好。我做错了什么


我在scala 2.11上使用Spark 2.1,将文本数组传递给UDF没有多大意义,因为要传递的是列的名称,而不是文本值。第二种情况失败,因为您正在创建字符串类型的列(
lit(“col1”)
是一个内容为“col1”的文本列,它没有引用列
col1

我想这样说:

def asColArray(xs: Seq[String]) = array((xs.map(x => col(x))): _*)

val arrayColumns = asColArray(Array("col1","col2"))

df.withColumn("udfFunction",udfFunction(arrayColumns))
val arrayColumns = asLitArray(Array(1.0,2.0))
如果确实要使用文字值,则需要执行以下操作:

def asColArray(xs: Seq[String]) = array((xs.map(x => col(x))): _*)

val arrayColumns = asColArray(Array("col1","col2"))

df.withColumn("udfFunction",udfFunction(arrayColumns))
val arrayColumns = asLitArray(Array(1.0,2.0))
但这会给你一个恒定的udf输出