Spark SQL: если слово из списка слов содержится в столбце, вернуть найденное слово в новый столбец - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь вернуть новый столбец "найденных" слов из списка слов. Я написал код возврата «T», когда слово найдено. Как мне вернуть фактическое слово?

Мой список слов:

['убийство', 'насилие', 'воспоминание', 'культ', 'месть', 'романти c ',' comedy ',' psychedeli c ',' susseful ',' train ']

В настоящее время:

from pyspark.sql.functions import col, when

df.select(
    "*", 
    when(col("tags").rlike("|".join(list)), 'T').alias("toptags"), 
).show()

+--------------------+-------+
|                tags|toptags|
+--------------------+-------+
|cult, horror, got...|      T|
|            violence|      T|
|they dream of som...|   null|
|                imdb|   null|
|inspiring, romant...|      T|
+--------------------+-------+

Желаемый результат:

+--------------------+-------+
|                tags|toptags|
+--------------------+-------+
|cult, horror, got...|   cult |
|            violence|violence|
|they dream of som...|   null |
|                imdb|   null |
|inspiring, romant...|romance |
+--------------------+-------+

1 Ответ

0 голосов
/ 25 февраля 2020

Пример кадра данных:

from pyspark.sql import functions as F
list=(['cult, horror, got'],
     ['violence'],
     ['they dream of some'],
     ['imdb'],
     ['inspiring, romantic'])
df=spark.createDataFrame(list,['tags'])
df.show()

+-------------------+
|               tags|
+-------------------+
|  cult, horror, got|
|           violence|
| they dream of some|
|               imdb|
|inspiring, romantic|
+-------------------+

Будет работать с Spark2.4 +:

Ваш список слов будет помещен в новый столбец для каждой строки, чтобы мы могли использовать array_intersect на две колонки. Чтобы поместить теги в форму массива, мне пришлось удалить ',' и разделить на ''. Затем мы можем сделать array_intersect, чтобы получить точное совпадение.

list=['murder', 'violence', 'flashback', 'cult', 'revenge', 'romantic', 'comedy', 'psychedelic', 'suspenseful', 'train']
df.withColumn("words", F.array([F.lit(string) for string in list]))\
.withColumn("tags2", F.split(F.regexp_replace("tags", '\,',""),' '))\
.withColumn("toptags", F.array_intersect("tags2","words")[0])\
.drop("words","tags2").show()


+-------------------+--------+
|               tags| toptags|
+-------------------+--------+
|  cult, horror, got|    cult|
|           violence|violence|
| they dream of some|    null|
|               imdb|    null|
|inspiring, romantic|romantic|
+-------------------+--------+

Кроме того, если вы хотите получить как все совпадения топтага, а не только первое совпадение, удалите [0] после array_intersect, чтобы получить массив все матчи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...