PySpark报错:'list' object has no attribute 'map' 求助
问题解决:'list' object has no attribute 'map'
错误原因
simple_tokenize(line)返回的是Python普通列表,而map()是PySpark RDD专属方法,列表对象没有这个属性,因此触发报错。另外原代码用collect()把整个RDD数据拉到Driver端循环处理,不仅效率极低,还丢失了Spark分布式计算的优势,数据量大时甚至会引发内存溢出。
正确代码写法
直接在RDD上做分布式处理,不要将数据拉到本地列表:
df = sc.textFile("/content/Shakespeare.txt") # 先对每行分词并展开为单个词的RDD,再生成(word,1)键值对 rdd2 = df.flatMap(lambda line: simple_tokenize(line)).map(lambda word: (word, 1)) # 按词聚合计数 rdd3 = rdd2.reduceByKey(lambda a, b: a + b)
关键说明
flatMap:将每行分词后的列表展开,把每个词作为RDD的单独元素,这是文本分词场景的标准操作- 全程基于RDD操作,数据保持在集群节点分布式存储,避免Driver端内存压力
内容的提问来源于stack exchange,提问作者Prikshit Batta
相关产品推荐
相关产品推荐

