Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyspark Pypark使用键计算值的发生率_Pyspark - Fatal编程技术网

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写了为什么