PySpark中RDD连接后报错:'tuple' object has no attribute 'split'
排查PySpark中
AttributeError: 'tuple' object has no attribute 'split'错误 这个问题的根源很清晰——你误解了join之后RDD的元素结构,直接对tuple类型的元素调用了只有字符串才有的split方法。
错误原因分析
先拆解下你代码里的RDD结构:
ordersReduce是(订单ID, 总金额)的键值对RDDordersmap是(订单ID, 订单状态)的键值对RDD- 当你执行
ordersReduce.join(ordersmap)后,orderstatus中的每个元素变成了**(订单ID, (总金额, 订单状态))**这样的嵌套tuple,而不是你之前处理的字符串行数据。
你写的orderstatus.map(lambda oi: oi.split(",")[1])里,oi是这个嵌套tuple,而tuple根本没有split方法,所以直接抛出了AttributeError。
解决方法
根据你的需求(提取订单状态),你需要直接访问tuple中的对应元素,而不是去调用split。把出错的那行代码改成下面这样:
renvStatus = orderstatus.map(lambda oi: oi[1][1])
这里的索引逻辑是:
oi[0]:关联的订单ID(key)oi[1]:join后得到的两个value组成的tupleoi[1][0]:来自ordersReduce的总金额oi[1][1]:来自ordersmap的订单状态(也就是你想要提取的内容)
完整修正后的代码
orderitems = sc.textFile("/user/zzz/data/retail_db/order_items/part-00000") orderitemsmap = orderitems.map(lambda oi: (int(oi.split(",")[1]), float(oi.split(",")[4]))) ordersReduce = orderitemsmap.reduceByKey(lambda x,y:x+y) orders = sc.textFile("/user/zzz/data/retail_db/orders/part-00000") ordersmap = orders.map(lambda oi:(int(oi.split(",")[0]), oi.split(",")[3])) orderstatus = ordersReduce.join(ordersmap) # 正确提取订单状态 renvStatus = orderstatus.map(lambda oi: oi[1][1]) for i in renvStatus.take(10): print(i)
如果你的需求不是提取订单状态,而是要处理总金额或者拼接两者,只需要调整索引即可——比如要取总金额就用oi[1][0],完全不需要用split来处理。
内容的提问来源于stack exchange,提问作者sravan
相关产品推荐
相关产品推荐

