Как найти все смайлики из столбца PySpark Dataframe? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть столбец во фрейме данных spark, в котором есть несколько сообщений. Вот образец:

message = [
  (1, "Sempre com @mariahcarey fazendo aquele aquecimento na voz antes dos shows. Quem lembra dessa? ?❤️"),
  (2, "Happy Easter from the real bunny ??"),
  (3, "Anakku aku udah diajak nonton malam mingguan kemarin??  tua? Haduhhh bener2 deh??? @gadiiing @raffinagita1717")
]

rdd1 = sc.parallelize(message)
df=sqlContext.createDataFrame(rdd1,['id', 'message'])

Мне нужно найти все эмоции в сообщениях. Используя следующий код, можно найти первое совпадение:

import emoji
import re

emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys())
escape_list = '|'.join(re.escape(p) for p in emojis_list)
df.withColumn("emoji_in_post", fn.regexp_extract("message", escape_list, 0))

Но мне нужны все из них. Поэтому я попытался создать UDF, используя vanila python.

from pyspark.sql.types import ArrayType, StructType, StructField, StringType, IntegerType
import pyspark.sql.functions as fn

def find_all_emo(plain_text):
  emo_list = re.findall(escape_list, plain_text)
  return emo_list

search_all_emojis = fn.udf(lambda y: find_all_emo(y), ArrayType(StringType()))

Но при применении этой функции к информационному фрейму я получаю ошибку.

TypeError: expected string or bytes-like object

Если кто-то знает проблему или имеет лучшее решение. Заранее спасибо.

1 Ответ

0 голосов
/ 11 июля 2019

Итак, я нашел проблему. Есть несколько строк, когда значение сообщения равно нулю. Поэтому мне пришлось расширить функцию find all.

def find_all_emo(plain_text):
  if plain_text is None:
    return None
  emo_list = regex.findall(plain_text)
  return emo_list

search_all_emojis = fn.udf(lambda y: find_all_emo(y), ArrayType(StringType()))

test = df.withColumn("emoji_in_post", search_all_emojis(fn.col("message")))

Теперь выходной результат - пустой массив или массив с некоторыми эмодзи.

...