PySpark RDD map传整行报'tuple'无Latitude属性错误原因问询
报错原因解释:AttributeError: 'tuple' object has no attribute Latitude
核心根因
validated_rdd中的元素已经不是Spark的Row对象,而是普通tuple类型,仅支持下标索引取值,不支持属性名访问,具体触发过程如下:
- 初始
df.rdd的每个元素都是Spark原生Row对象,所以传入check_for_invalid_coords的row是Row类型,天然支持通过.属性名的方式取字段,和你观察到的现象一致。 - 问题出在
check_for_invalid_coords的返回值:你第一种写法中对validated_rdd的元素用row[5]、row[6]下标取值,说明check_for_invalid_coords处理完后返回的是元组,而非Row对象。经过map操作后,validated_rdd存储的所有元素都是普通tuple。 - 第二种写法中你直接把
validated_rdd里的tuple传给create_geo_hash,尝试用.Latitude属性访问tuple的字段,就会触发属性不存在的报错。
解决方案
两种修复方式可选:
- 方式1:继续用下标取值,修改
create_geo_hash的字段获取逻辑
def create_geo_hash(row): # 替换为Latitude、Longitude对应的实际下标即可 latitude = float(row[5]) longitude = float(row[6]) geo_hash = pygeohash.encode(latitude, longitude, precision=4) return geo_hash
- 方式2:修改
check_for_invalid_coords的返回值,处理完后仍返回Row对象,维持属性访问能力
from pyspark.sql import Row def check_for_invalid_coords(row): # 保留原有校验处理逻辑 # 最后构造Row对象返回,字段名和原DataFrame保持一致即可 return Row(Latitude=处理后的纬度值, Longitude=处理后的经度值, 其他字段名=对应处理后的值)
内容的提问来源于stack exchange,提问作者Vlad Vlad
相关产品推荐
相关产品推荐

