У меня есть столбец во фрейме данных 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
Если кто-то знает проблему или имеет лучшее решение. Заранее спасибо.