spark数据帧udf映射索引值

spark数据帧udf映射索引值

问题描述:

我有一个火花数据帧,其中一列由列表的索引组成。我想写一个udf,它允许我创建一个与索引相关的值的新列。spark数据帧udf映射索引值

E.g.

假设我有以下的数据帧和数组:

val df = spark.createDataFrame(Seq((0, Array(1, 1, 2)), (1, Array(1, 2, 0)))) 
df.show() 
+---+---------+ 
| _1|  _2| 
+---+---------+ 
| 0|[1, 1, 2]| 
| 1|[1, 2, 0]| 
+---+---------+ 
val sArray = Array("a", "b", "c") 

我希望能够在indicies在_2自己的价值观在sArray映射导致这种:

+---+---------+---------+ 
| _1|  _2|  _3| 
+---+---------+---------+ 
| 0|[1, 1, 2]|[b, b, c]| 
| 1|[1, 2, 0]|[b, c, a]| 
+---+---------+---------+ 

我有一直试图做到这一点与udf:

def indexer (values: Array[String]) = 
    udf((indices: Array[Int]) => indices.map(values(_))) 
df.withColumn("_3", indexer(sArray)($"_2")) 

但是,当我这样做时,出现以下错误:

Failed to execute user defined function

... Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [I

这里发生了什么问题?我怎样才能解决这个问题?

+2

的可能的复制[如何转换WrappedArray列火花数据帧为字符串?](http://*.com /问题/ 34539068 /如何-DO-I-转换-A-wrappedarray列式火花非数据帧到字符串) –

当在DataFrame中的ArrayType列上操作时,传递到UDF的实际类型是mutable.WrappedArray。您看到的失败是试图将此WrappedArray转换为您的函数期望的Array[Int]的结果。

解决方法是相当简单 - 定义函数期待一个mutable.WrappedArray[Int]

def indexer (values: Array[String]): UserDefinedFunction = { 
    udf((indices: mutable.WrappedArray[Int]) => indices.map(values(_))) 
}