我刚开始使用Spark。我正在尝试计算推文中每个令牌的提及次数。为此,我用user_id和tweets创建了rdd对,并按每个user_id分组(因此,我将user作为键,将tweets作为每个用户作为值的元组)。对推文应用了标记化功能,并删除了每个用户的重复标记。然后,我将每个令牌映射到1并按键减少。请参见下面的代码:
user_tweets.mapValues(lambda x: list(tok.tokenize(x))).mapValues(set).flatMap(lambda x: ((i, 1) for i in x[1])).reduceByKey(lambda a,b: a+b)
我注意到在对推文进行标记化时,元组的'('和')'被创建为单独的标记。
原始推文:
('14241527', (“ RT @BernieSanders:“我一定会调查的。”-@HillaryClinton> \ n \ n投票者应该知道她对华尔街和Big Pharma的看法……”, 'RT @CamaraNjeri:伯尼❤️。))
标记化的推文:
('14241527',['(',“'”,'rt','@berniesanders',':',
“”,“ i”,“将”,“一定”,“外观”,“进入”,“它”, '。','“','-','@ hillaryclinton','\','n','\',
'nvoters','deserve','to','know','what','she',
“告诉”,“墙壁”,“街道”,“与”,“大”,“制药”,
'beh','...',“'”,',',“','rt','@ camaranjeri',
':','bernie','❤','️','。',
')'])
我知道tok.tokenize(x)会收到一个元组,并解析整个表达式,包括我试图避免的括号和逗号。我尝试过
user_tweets.mapValues(lambda x: list(tok.tokenize(i) for i in x)))
但出现以下错误:
Can't pickle local object 'Tokenizer.tokenize.<locals>.<lambda>'
请问该如何解决?
答案 0 :(得分:0)
pickle
无法序列化lambda
函数。那就是错误要告诉你的。
尝试明确定义函数:
def row_tokenizer(row):
return [tok.tokenize(x) for x in row]
然后将其传递到mapValues
的{{1}}方法调用中。