如何创建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可以返回索引。我试图这样写一个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)

将“ Array [String]”更改为“ Seq [String]”,它现在可以正常工作〜嗨,Nader Hadji Ghanbari,谢谢您的建议〜

在Spark中,该数组表示为WrappedArray,类似于带有Wrapper的数组。要开始工作,您可以将签名更改为Seq,WrappedArray或List。

def indexOf(s: String) = udf((n: Seq[String]) => 
    if (n.contains(s)) n.indexOf(s) else -1)

要么

def indexOf(s: String) = udf((n: WrappedArray[String]) => 
    if (n.contains(s)) n.indexOf(s) else -1)

要么

def indexOf(s: String) = udf((n: List[String]) => 
    if (n.contains(s)) n.indexOf(s) else -1)

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章