PySpark获取GroupedData长度触发has no len()报错如何解决
PySpark调用len(GroupedData)报错的解决方法
报错原因
PySpark的GroupedData对象和pandas的GroupBy对象底层逻辑不同:
- pandas执行groupby后会立即计算所有分组并将结果缓存到内存,属于可迭代对象,内置
__len__方法,调用len()直接返回分组总数 - PySpark的
GroupedData只是分组转换的逻辑描述,属于懒加载操作,没有实际执行计算,也没有存储分组数量等元信息,因此未实现__len__方法,直接调用len()就会触发object of type 'GroupedData' has no len()的报错
正确实现方式
你需要实现的是获取A_1字段分组后的总组数,有两种可行方案:
方案1:与pandas逻辑完全对齐
先完成分组计数操作,再统计结果的行数即为总分组数,和你原pandas代码的执行逻辑完全一致:
gb = df.groupBy('A_1').count() l = gb.count() print(l)
方案2:性能更优的等价写法
总分组数本质等于A_1字段的去重值数量(groupBy会将null值单独作为一个分组,distinct统计也包含null值,结果完全一致),省去了计算每个分组行数的开销,执行效率更高:
l = df.select('A_1').distinct().count() print(l)
内容的提问来源于stack exchange,提问作者Fatemeh
相关产品推荐
相关产品推荐

