将字符串与scala数据帧中的Array [String]进行比较?

时间:2018-04-06 10:03:43

标签: arrays scala dataframe spark-dataframe

如何在scala中将String与Array [String]进行比较?

例如,如果" a"属于[" a"," b"," c"]。

我有dataframe df

          col1   col2
          a      [a,b,c]
          d      [a,b,c]   

预期输出

          col1   col2        status
          a      [a,b,c]     present  
          d      [a,b,c]     missing 

我在scala中编写了以下脚本

val arrayContains = udf( (col1: String, col2: Array[String]) =>
  if(col2.contains(col1) ) "present" else "missing" ) 

我在我的数据框中添加了新列,填写了这个新列" status"如下

df.withColumn("status", arrayContains($"col1", $"col2" )).show()

但它会提示我跟踪错误。

  

(run-main-0)org.apache.spark.SparkException:无法执行用户定义的函数(anonfun $ 1:(string,array)=> string)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你走了:

import org.apache.spark.sql.functions._
import scala.collection.mutable

+----+---------+
|col1|     col2|
+----+---------+
|   a|[a, b, c]|
|   d|[a, b, c]|
|   e|[a, b, c]|
|  aa|[a, b, c]|
|   c|[a, b, c]|
|   f|       []|
+----+---------+

def compareStrAgainstArray() = udf((str: String,lst: mutable.WrappedArray[String]) => 
                                 if (lst.exists(str.matches(_)))"present" else "missing")  

df.withColumn("status",compareStrAgainstArray()($"col1",$"col2")).show()

+----+---------+-------+
|col1|     col2| status|
+----+---------+-------+
|   a|[a, b, c]|present|
|   d|[a, b, c]|missing|
|   e|[a, b, c]|missing|
|  aa|[a, b, c]|missing|
|   c|[a, b, c]|present|
|   f|       []|missing|
+----+---------+-------+    

希望这有帮助!