Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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
Python 在PySpark中为KeyVal RDD中的每个键收集前N个条目_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 在PySpark中为KeyVal RDD中的每个键收集前N个条目

Python 在PySpark中为KeyVal RDD中的每个键收集前N个条目,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个包含大量KeyVal条目的RDD。同一个密钥将出现多次,我感兴趣的是提取每个密钥的前N个条目。作为Spark的新手,我目前还不知道如何做到这一点,所以如果有任何帮助,我将不胜感激 输入可能如下所示: rdd = sc.parallelize([('a',1),('a',2),('b',3),('a',5),('b',4),('b',6)]) 例如,每个键的前2个条目的期望最终输出: output = {'a':[1,2], 'b':[3,4]} 如果我只对前n个条目感兴趣,我当然可以

我有一个包含大量KeyVal条目的RDD。同一个密钥将出现多次,我感兴趣的是提取每个密钥的前N个条目。作为Spark的新手,我目前还不知道如何做到这一点,所以如果有任何帮助,我将不胜感激

输入可能如下所示:

rdd = sc.parallelize([('a',1),('a',2),('b',3),('a',5),('b',4),('b',6)])
例如,每个键的前2个条目的期望最终输出:

output = {'a':[1,2], 'b':[3,4]}
如果我只对前n个条目感兴趣,我当然可以对初始RDD应用
take(n)
。我要寻找的是一种类似于
take(n)
函数的方法,但要迭代每个键。如果我可以创建一个RDD,它只保存原始RDD的所需子集,这将很好。事后查字典不是什么问题

因此,中间输出(RDD样式)将是:

[('a',1),('a',2),('b',3),('b',4)]
如何在PySpark中实现这一点

编辑:建议的重复问题特别需要使用
reduceByKey
解决,这在本例中不是必需的。

请听这里的孩子

nLength = 2
rdd.groupByKey().map(lambda x: (x[0], list(x[1])[:nLength]))
说明:

rdd.groupByKey()  
按键对RDD进行分组(在我们的示例中为“a”或“b”)。结果:
[('a',可结果),('b',可结果]


这部分创建了一个元组:在左边是键('a'或'b'),在右边我们从resultiteable(x[1])创建一个列表,然后将列表从0剪切到nLength([:nLength])


享受吧

也许这样简单就可以了:

rdd = sc.parallelize([('a',1),('a',2),('b',3),('a',5),('b',4),('b',6)])
n = 2
rdd.groupByKey().map(lambda x : (x[0], list(x[1])[:n])).collect()
输出:

[('b', [3, 4]), ('a', [1, 2])]
试试这个:

 def slice_list(s,no_of_values):
        return s[0:no_of_values]


rdd.groupByKey().map(lambda x: (x[0],slice_list( list(x[1]),2))).collect()
可能重复的
 def slice_list(s,no_of_values):
        return s[0:no_of_values]


rdd.groupByKey().map(lambda x: (x[0],slice_list( list(x[1]),2))).collect()