我已经阅读了一个json文件并在spark中转换为dataframe。它具有包含值列表的列技巧。现在,我想过滤数据框,使列技能具有其他列表的任何值。
例如:
skill= ["A", "B", "C", "D"] and list=["A", "Z"]
skill= ["E", "B", "C", "D"] and list=["A", "Z"]
然后,过滤器代码应显示第一行,而忽略另一行。我正在Scala中尝试。
答案 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]|
+------------+