1
我有一个表如下:如何创建一个UDF找到索引数组列
val question = sqlContext.createDataFrame(Seq((1, Seq("d11","d12","d13")), (2, Seq("d21", "d22", "")))).toDF("Id", "Dates")
+---+---------------+
| Id| Dates|
+---+---------------+
| 1|[d11, d12, d13]|
| 2| [d21, d22, ]|
+---+---------------+
的“日期”栏包含字符串数组。我想创建一个udf,如果数组包含目标字符串,可以返回索引。 我试着写一个像这样的UDF:
def indexOf(s: String) = udf((n: Array[String]) => if (n.contains(s))
n.indexOf(s) else -1)
question.withColumn("index", indexOf("d11")(question("Dates"))).show()
但是,我得到了一个错误信息是这样的:
org.apache.spark.SparkException: Failed to execute user defined function($anonfun$indexOf$1: (array<string>) => int)
有什么事去可怕的错误吗?
更新: 我还发现有一个错误消息是这样的:
Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String;
所以我修改我的UDF为:
def indexOf(s: String) = udf((n: Seq[String]) => if (n.contains(s)) n.indexOf(s) else -1)
更改了 “数组[字符串]” 到“序列[字符串]“,它现在正在工作〜 嗨,纳德哈吉·甘巴里,感谢您的建议〜