我在Spark Shell(1.6)中将字符串列表转换为如下数组:
val mapData = List("column1", "column2", "column3")
val values = array(mapData.map(col): _*)
值的类型是:
值:org.apache.spark.sql.Column = array(column1,column2,column3)
一切都很好,但是当我开始在Eclipse中开发时,我收到了错误:
找不到
所以我改为:
val values = Array(mapData.map(col): _*)
我遇到的问题是现在价值的类型已经改变了,消耗它的udf不接受这种新类型:
values:Array [org.apache.spark.sql.Column] = Array(column1,column2, 栏3)
为什么我无法在我的IDE中使用array(),就像在Shell中一样(我缺少什么导入)?以及为什么数组在没有Array []包装器的情况下生成org.apache.spark.sql.Column
?
编辑:udf功能:
def replaceFirstMapOfArray =
udf((p: Seq[Map[String, String]], o: Seq[Map[String, String]]) =>
{
if((null != o && null !=p)){
if ( o.size == 1 ) p
else p ++ o.drop(1)
}else{
o
}
})
答案 0 :(得分:3)
val mapData = List("column1", "column2", "column3")
val values = array(mapData.map(col): _*)
下面,
Array
或List
是对象的集合
其中array
中的array(mapData.map(col): _*)
是一个spark函数,它为相同的数据类型列创建一个带有类型数组的新列。
要使用此功能,您需要导入
import org.apache.spark.sql.functions.array
你可以在这里看到有关数组
的信息/** * Creates a new array column. The input columns must all have the same data type. * @group normal_funcs * @since 1.4.0 */ @scala.annotation.varargs def array(cols: Column*): Column = withExpr { CreateArray(cols.map(_.expr)) }