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输出