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
这里发生了什么问题?我怎样才能解决这个问题?
答
当在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(_)))
}
的可能的复制[如何转换WrappedArray列火花数据帧为字符串?](http://stackoverflow.com /问题/ 34539068 /如何-DO-I-转换-A-wrappedarray列式火花非数据帧到字符串) –