pySpark中map返回值传入reduceByKey(lambda)运行报错如何解决?
问题原因排查
- 核心报错
TypeError: unsupported operand type(s) for +: 'int' and 'str'来自lan_map函数的返回值类型不一致:
只有首个判断分支返回的是整数元组(1,1),其余分支返回的是带引号的字符串("1,0"/"0,1"/"0,0"都是字符串类型,且不是元组结构),reduce计算时字符串和整数相加直接触发类型错误。 lan_map的判断逻辑存在语法错误:if "word1" and "word2" in x:的实际判断逻辑是「"word1"不为空 且 x包含word2」,和你预期的「x同时包含word1和word2」不符,正确写法为if "word1" in x and "word2" in x:。- RDD不支持列表式的下标索引,
mapfun[1]写法非法,如需获取RDD中的元素可使用mapfun.take(n)(取前n个元素)、mapfun.first()(取首个元素)这类action算子。 - 自定义reduce函数
fun2存在两处错误:- 无
return语句,函数执行后返回None,无法参与后续计算 - 调用
reduceByKey时直接写fun2(x,y)属于立即执行函数,而reduceByKey要求传入函数引用,正确写法为reduceByKey(fun2)
- 无
修正后的完整代码
import findspark findspark.init() from pyspark import SparkConf, SparkContext from pyspark import SQLContext conf=SparkConf().setMaster("local").setAppName("mein soft") sc=SparkContext(conf=conf) sqlContext=SQLContext(sc) lines=sc.textFile("File.txt") def lan_map(x): if "word1" in x and "word2" in x: return ("Count",(1,1)) elif "word1" in x: return ("Count",(1,0)) elif "word2" in x: return ("Count",(0,1)) else: return ("Count",(0,0)) mapfun=lines.map(lan_map) # 如需查看map结果可执行 print(mapfun.take(5)) 取前5个元素验证 result = mapfun.reduceByKey(lambda x, y: (x[0]+y[0], x[1]+y[1])).collect() print(result)
自定义reduce函数的正确写法
def fun2(x,y): return (x[0]+y[0], x[1]+y[1]) result = mapfun.reduceByKey(fun2).collect()
内容的提问来源于stack exchange,提问作者Eche Stare
相关产品推荐
相关产品推荐

