Spark проверяет, содержится ли какое-либо слово из массива данных в другом списке? - PullRequest
0 голосов
/ 13 декабря 2018

Я прочитал файл json и преобразовал его в dataframe в spark. У него есть навык столбца, который содержит список значений.Теперь я хочу отфильтровать фрейм данных так, чтобы у навыка столбца было какое-либо значение другого списка.

Например:

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

Тогда код фильтра должен показывать первую строку и игнорировать другуюстрока.Я пробую это в скале.

1 Ответ

0 голосов
/ 13 декабря 2018

Если у вас нет 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]|
+------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...