Scala 火花检查数据帧数组中的任何单词是否包含在另一个列表中?
我读过一个json文件,并在spark中转换为dataframe。它有一个包含值列表的列。现在,我想过滤数据帧,使列skills具有另一个列表的任何值 例如:Scala 火花检查数据帧数组中的任何单词是否包含在另一个列表中?,scala,apache-spark,Scala,Apache Spark,我读过一个json文件,并在spark中转换为dataframe。它有一个包含值列表的列。现在,我想过滤数据帧,使列skills具有另一个列表的任何值 例如: skill= ["A", "B", "C", "D"] and list=["A", "Z"] skill= ["E", "B", "C", "D"] and list=["A", "Z"] 然后,过滤器代码应该显示第一行,而忽略另一行。我正在scala中试用。如果您没有2.4版本,则需要使用udf()。看看这个: val df = S
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”},explode..然后检查技能是否包含分解的项目,过滤,然后在技能列上删除重复项。迂回,但有效
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]|
+------------+
list
是否也是数据框中的一列,还是只有一个列表用于数据框中的所有行?