泡菜.PicklingError: 来自__newobj__ args 的 args[0] 与 hadoop pytho



我正在尝试通过火花删除停用词,代码如下

from nltk.corpus import stopwords
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
sc = SparkContext('local')
spark = SparkSession(sc)
word_list=["ourselves","out","over", "own", "same" ,"shan't" ,"she", "she'd", "what", "the", "fuck", "is", "this","world","too","who","who's","whom","yours","yourself","yourselves"]
wordlist=spark.createDataFrame([word_list]).rdd
def stopwords_delete(word_list):
filtered_words=[]
print word_list

for word in word_list:
print word
if word not in stopwords.words('english'):
filtered_words.append(word)

filtered_words=wordlist.map(stopwords_delete)
print(filtered_words)

我得到的错误如下:

泡菜。PicklingError: args[0] fromnewobj args有错误的类

我不知道为什么,有人可以帮助我。
提前致谢

这与上传停用词模块有关。作为函数本身导入停用词库的解决方法。请参阅下面链接的类似问题。 我遇到了同样的问题,这个解决方法解决了这个问题。

def stopwords_delete(word_list):
from nltk.corpus import stopwords
filtered_words=[]
print word_list

类似问题

我建议from pyspark.ml.feature import StopWordsRemover作为永久修复。

可能只是因为你每次在执行器上定义 arrestwords.words('english'(。在外面定义它,这将起作用。

您正在对只有一行的 rdd 使用 map,每个单词都作为 column.so,整行 rdd 的类型被传递给stopwords_delete函数,并在其中的 for 循环中,试图将 rdd 与停用字匹配,但失败了。像这样尝试,

filtered_words=stopwords_delete(wordlist.flatMap(lambda x:x).collect())
print(filtered_words)

我得到了这个输出作为filtered_words,

["shan't", "she'd", 'fuck', 'world', "who's"]

此外,在函数中包含返回值。

另一种方式,您可以使用列表推导来替换stopwords_delete功能,

filtered_words = wordlist.flatMap(lambda x:[i for i in x if i not in stopwords.words('english')]).collect()

问题与停用词有关。 您需要以稳定的方式确定它