spark dataframe udf 将索引映射到值
spark dataframe udf mapping indices to values
我有一个 spark 数据框,其中一列由列表的索引组成。我想编写一个 udf,允许我使用与索引关联的值创建一个新列。
例如
假设我有以下数据框和数组:
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")
我希望能够将 _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(_)))
}
我有一个 spark 数据框,其中一列由列表的索引组成。我想编写一个 udf,允许我使用与索引关联的值创建一个新列。
例如
假设我有以下数据框和数组:
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")
我希望能够将 _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(_)))
}