【发布时间】:2019-07-11 20:07:36
【问题描述】:
我在 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))
但我需要所有这些。所以我尝试使用 vanila python 创建一个 UDF。
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
如果有人知道问题或有更好的解决方案。提前致谢。
【问题讨论】:
-
你是如何应用 udf 的,你也可以添加那个代码吗?
标签: apache-spark pyspark user-defined-functions