假设我正在尝试删除此正则表达式“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中创建此代码?
答案 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])