【spark】三 python 用RDD.reduceByKey 方法实现 count(value),count(distinct value) [待验证]

在Zeppelin的PySpark环境中,由于DataFrame.groupBy().agg()操作处理大数据时可能导致内存溢出,建议使用RDD.reduceByKey()方法。本文介绍了如何使用reduceByKey计算每个key的value数量以及去重后的value数量。通过示例代码展示了如何实现这两个功能,包括使用defaultdict和operator.add,以及利用mapPartitions和distinct方法进行优化。此外,还提到了非精确的去重计数方法,如基于HyperLogLog算法的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

zeppelin的pyspark中 DataFrame.groupBy(*cols).agg()操作大数据量会爆内存。
推荐用RDD.reduceByKey()但是这个只能对两列,以第一列为key,第二列为value。
而且在同一个task上,同partition的数据先是同key的valfue进行合并操作,以此大大减少后面shuff的数据量。
本来想实现select groupkey,count(value),count(distinct value) from table group by groupkey的sql语句,
但是spark-sql机制跟dataframe/rdd操作不一样,调优也是各种问题导致失败;
只得用dataframe的算子,但是到了数据量太大,groupby也是不行;
只得再想办法用RDD.reduceByKey

网上全是千篇一律的operator.add 操作,然后发现operator是一个运算模块,根本不是给PipelinedRDD的配套运算

实现 select key,count(value) from table group by key

rdd = sc.parallelize(List(("0", "v1"), ("0", "v2"), ("1", "v1"), (2, "v2")), 2)
result=rdd.countByKey()
print(result)

defaultdict(<type 'int'>, {u'2': 1, u'1': 1, u'0': 2})

注意:结果是是defaultdict,是输入的是两列,内部调用的是x[0].countByValue() ,即对相同key计算值出现总个数countByValue

经一亿条数据测试,countByKey()还是会内存不够,跟reduceByKey不同,换一种实现思路:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值