解决方案来源于

错误信息

# 错误代码
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()
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐