我已经读了一个json文件并在spark中转换为dataframe。它具有包含值列表的列技能。现在我想过滤数据框,使列技能具有另一个列表的任何值。
例如:
skill= ["A", "B", "C", "D"] and list=["A", "Z"]
skill= ["E", "B", "C", "D"] and list=["A", "Z"]
然后,过滤器代码应显示第一行并忽略另一行。我在scala中尝试它。
如果你没有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] |
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。