开发者社区> 问答> 正文

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

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

例如:

skill= ["A", "B", "C", "D"] and list=["A", "Z"]
skill= ["E", "B", "C", "D"] and list=["A", "Z"]
然后,过滤器代码应显示第一行并忽略另一行。我在scala中尝试它。

展开
收起
社区小助手 2018-12-21 13:31:57 2157 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    如果你没有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]
    2019-07-17 23:23:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载