pyspark中jieba的使用问题
·
错误信息
# 错误代码
data.select('Review').rdd.map(
lambda x:jieba.cut(content)
).collect()
#错误信息
NameError: name 'content' is not defined
原因分析
网上大佬说的,来源:
大概意思是map()里的东西没有序列化,查阅博客后得知,jieba是运行在Driver端的,而map()是运行在Executor端的,两个操作是在不同地方执行的,所以我把new JiebaSegmenter()的操作搬到了map()里就ok了。
翻译成‘朴树’一点的意思就是,spark还没开始运动,jieba就等不及了,但我还是看不太懂他是怎么解决的,因为人生苦短。
之后继续查阅资料,终于……
解决方案
1.导包
2.封装分词函数
3.注册分词函数
4.使用它吧
# 词频统计
import jieba
from pyspark.sql import functions as F # spark的自定义函数包
from pyspark.sql.types import ArrayType, StringType # sparkSQL的数据类型
def seg_sentence(content): # 封装结巴
return [i for i in jieba.cut(content)]
seg_sentence=F.udf(seg_sentence,ArrayType(StringType())) # 定义sparkSQL自定义函数
text=data.select(seg_sentence('Review').alias('words')).show() # 就OK了
分词后的词频统计
看了一大圈教程,发现没多少python语言的,希望看到的大家多发python版的资料,为python传道。
1.拍扁words中的数组
2.为每个元素加上初始值1
3.根据key(词)来统计
text.rdd\
.flatMap(lambda x: x.words)\
.map(lambda x:(x,1))\
.reduceByKey(lambda a,b:a+b)\
.collect()
更多推荐
所有评论(0)