如何使用RDD删除PySpark中的某些正则表达式?

时间:2017-10-28 22:01:54

标签: apache-spark pyspark

假设我正在尝试删除此正则表达式“RT \ s * @ USER \ w \ w {8}:\ s *” 我想在我的RDD中删除这种形式的正则表达式。

我目前的RDD是:

text = sc.textFile(...)
delimited = text.map(lambda x: x.split("\t"))

这是我试图删除正则表达式的部分。 我尝试按照RDD转换来删除与这个正则表达式匹配的每个字符串,但这都给了我一个错误。

abc = delimited.map(lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x))
TypeError: expected string or buffer

abc = re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", delimited)
TypeError: expected string or buffer

abc = delimited.map(lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", text))
Exception: It appears that you are attempting to broadcast an RDD or reference an RDD from an action or transformation. RDD transformations and actions can only be invoked by the driver, not inside of other transformations; for example, rdd1.map(lambda x: rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063.

我想删除这个正则表达式,以便我可以继续进行下一个RDD转换。如何在PySpark中创建此代码?

1 个答案:

答案 0 :(得分:0)

re.sub需要一个字符串。

  • 在第一个匿名函数中:

    lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x)
    

    x是一个列表,因为您在上一次转换中拆分了该行。

  • 在第二次尝试中,您传递了RDD:delimeted

  • 在第三段代码中,您传递了另一个RDD:text

如果要为列表中的每个元素删除此正则表达式,请尝试以下操作:

abc = delimited.map(lambda l: [re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x) for x in l])