【问题标题】:How to Find all emoji from a PySpark Dataframe Column?如何从 PySpark 数据框列中查找所有表情符号?
【发布时间】: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


【解决方案1】:

所以我发现了问题。当 message 的值为空时,行数很少。所以我不得不扩展查找所有功能。

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")))

现在输出结果是空数组或带有一些表情符号的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多