火花检查数据帧数组中的任何单词是否包含在另一个列表中?

时间:2018-12-13 14:11:23

标签: scala apache-spark

我已经阅读了一个json文件并在spark中转换为dataframe。它具有包含值列表的列技巧。现在,我想过滤数据框,使列技能具有其他列表的任何值。

例如:

skill= ["A", "B", "C", "D"] and list=["A", "Z"]
skill= ["E", "B", "C", "D"] and list=["A", "Z"]

然后,过滤器代码应显示第一行,而忽略另一行。我正在Scala中尝试。

1 个答案:

答案 0 :(得分:1)

如果没有2.4,则需要使用udf()。检查一下:

val df = Seq(Array("A", "B", "C", "D"), Array("E", "B", "C", "D")).toDF("skills")
def skill_check(x:Seq[String]):Boolean = {
  val b = x.map( p=> Seq("A", "Z").exists( y => y==p)).filter(x=>x)
  if ( b.isEmpty ) false else true
}
val udf_skill_check = udf( skill_check(_:Seq[String]))
df.withColumn("check",udf_skill_check('skills) ).filter("check").show(false)

结果:

+------------+-----+
|skills      |check|
+------------+-----+
|[A, B, C, D]|true |
+------------+-----+

如果您不想使用UDF,则可以为检查清单引入新列,即[“ A”,“ Z”},爆炸。然后检查技能是否包含爆炸项目,过滤器和然后将重复项放在“技能”列上。回旋处,但可以

val df = Seq(Array("A", "B", "C", "D"), Array("E", "B", "C", "D")).toDF("skills")
val df2 = df.withColumn("chk1",lit(Array("A","Z"))) // New column
df2.withColumn("chk2",explode('chk1)).withColumn("chk3", array_contains('skills,'chk2)).filter("chk3").select("skills").dropDuplicates().show(false)

+------------+
|skills      |
+------------+
|[A, B, C, D]|
+------------+