Pyspark Pypark使用键计算值的发生率
我有一个Pyspark Pypark使用键计算值的发生率,pyspark,Pyspark,我有一个(键、值)对表单的列表: x=[(('cat','dog),('a','b')),(('cat','dog'),('a','b')),(('mouse','rat'),('e','f'))] 我想计算每个值元组与键元组一起出现的次数 期望输出: [(('cat','dog'),('a','b',2)),(('mouse','rat'),('e','f',1))] 一个有效的解决办法是: xs=sc.parallelize(x) xs=xs.groupByKey() xs=xs.map
(键、值)
对表单的列表:
x=[(('cat','dog),('a','b')),(('cat','dog'),('a','b')),(('mouse','rat'),('e','f'))]
我想计算每个值元组与键元组一起出现的次数
期望输出:
[(('cat','dog'),('a','b',2)),(('mouse','rat'),('e','f',1))]
一个有效的解决办法是:
xs=sc.parallelize(x)
xs=xs.groupByKey()
xs=xs.map(lambda (x,y):(x,Counter(y))
但是,对于大型数据集,此方法会占用磁盘空间(~600GB)。我试图使用reduceByKey
实现类似的解决方案:
xs=xs.reduceByKey(Counter).collect()
但我得到了以下错误:
TypeError: __init__() takes at most 2 arguments (3 given)
我通常是这样做的:
xs=sc.parallelize(x)
a = xs.map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
a.collect()
产生:
[((('mouse', 'rat'), ('e', 'f')), 1), ((('cat', 'dog'), ('a', 'b')), 2)]
我假设您想要(key1,key2)对中第二个键的计数(这里是1和2)
要实现这一点,请尝试以下方法:
a.map(lambda x: (x[0][0], x[0][1] + (x[1],))).collect()
最后一步基本上是重新映射它,以便获得第一个密钥对(如
('mouse','rat')
),然后获取第二个密钥对(如('e','f')
),然后将元组
版本的b[1]
,即计数添加到第二个密钥对。我通常是这样做的:
xs=sc.parallelize(x)
a = xs.map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
a.collect()
产生:
[((('mouse', 'rat'), ('e', 'f')), 1), ((('cat', 'dog'), ('a', 'b')), 2)]
我假设您想要(key1,key2)对中第二个键的计数(这里是1和2)
要实现这一点,请尝试以下方法:
a.map(lambda x: (x[0][0], x[0][1] + (x[1],))).collect()
最后一步基本上是重新映射它,以便获得第一个密钥对(如
('mouse','rat')
),然后获取第二个密钥对(如('e','f')
),然后将元组
版本的b[1]
,即计数添加到第二个密钥对。同样,仅供参考,如果可以避免,则永远不要使用groupByKey
。Databricks还写道,仅供参考,如果可以避免的话,为什么永远不要使用groupByKey
。Databricks写了为什么