Scala DataFrame中如何比较String与Array[String]?
在Scala Spark中判断字符串是否存在于字符串数组中
我来帮你搞定这个需求,其实有两种靠谱的方式可以实现,咱们一步步看:
方法一:完善你写的自定义UDF
你定义的UDF逻辑是完全正确的,只是调用的时候没传对参数。完整的代码应该是这样的:
import org.apache.spark.sql.functions.udf // 定义判断数组是否包含指定字符串的UDF val arrayContains = udf( (targetStr: String, strArray: Array[String]) => if(strArray.contains(targetStr)) "present" else "missing" ) // 调用UDF给DataFrame添加status列 val resultDF = df.withColumn("status", arrayContains($"col1", $"col2")) // 查看最终结果 resultDF.show()
执行后就能得到你想要的输出:
+----+---------+-------+ |col1| col2| status| +----+---------+-------+ | a|[a, b, c]|present| | d|[a, b, c]|missing| +----+---------+-------+
方法二:用Spark内置函数(更推荐)
其实Spark已经内置了array_contains函数,完全不用自己写UDF,这种方式不仅代码更简洁,性能也更好(内置函数经过Spark的优化,避免了UDF的序列化开销)。用法如下:
import org.apache.spark.sql.functions.{array_contains, when} val resultDF = df.withColumn( "status", // 当col2包含col1时返回present,否则返回missing when(array_contains($"col2", $"col1"), "present").otherwise("missing") ) resultDF.show()
小提醒
注意array_contains的参数顺序是数组列在前,要查找的目标字符串在后,可别搞反了哦~
两种方式都能满足你的需求,但如果是处理大数据量的场景,优先用内置函数的方式,效率会更高。
内容的提问来源于stack exchange,提问作者user9601368
相关产品推荐
相关产品推荐

