Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 2.7 为Spark中RDD中的每个键获取前3个值_Python 2.7_Apache Spark_Lambda_Pyspark_Rdd - Fatal编程技术网

Python 2.7 为Spark中RDD中的每个键获取前3个值

Python 2.7 为Spark中RDD中的每个键获取前3个值,python-2.7,apache-spark,lambda,pyspark,rdd,Python 2.7,Apache Spark,Lambda,Pyspark,Rdd,我是Spark的初学者,我正在尝试创建一个RDD,其中包含每个键的前3个值(而不仅仅是前3个值)。我当前的RDD包含以下格式的数千个条目: (key, String, value) 想象一下,我有一个RDD,内容如下: [("K1", "aaa", 6), ("K1", "bbb", 3), ("K1", "ccc", 2), ("K1", "ddd", 9), ("B1", "qwe", 4), ("B1", "rty", 7), ("B1", "iop", 8), ("B1", "zxc"

我是Spark的初学者,我正在尝试创建一个RDD,其中包含每个键的前3个值(而不仅仅是前3个值)。我当前的RDD包含以下格式的数千个条目:

(key, String, value)
想象一下,我有一个RDD,内容如下:

[("K1", "aaa", 6), ("K1", "bbb", 3), ("K1", "ccc", 2), ("K1", "ddd", 9),
("B1", "qwe", 4), ("B1", "rty", 7), ("B1", "iop", 8), ("B1", "zxc", 1)]
我目前可以显示RDD中的前3个值,如下所示:

("K1", "ddd", 9)
("B1", "iop", 8)
("B1", "rty", 7)
使用:

top3RDD = rdd.takeOrdered(3, key = lambda x: x[2])
相反,我想为RDD中的每个键收集前3个值,因此我想返回以下值:

("K1", "ddd", 9)
("K1", "aaa", 6)
("K1", "bbb", 3)
("B1", "iop", 8)
("B1", "rty", 7)
("B1", "qwe", 4)

您需要按
键进行分组
,然后可以使用
heapq.nlargest
从每组中获取前3个值:

from heapq import nlargest
rdd.groupBy(
    lambda x: x[0]
).flatMap(
    lambda g: nlargest(3, g[1], key=lambda x: x[2])
).collect()

[('B1', 'iop', 8), 
 ('B1', 'rty', 7), 
 ('B1', 'qwe', 4), 
 ('K1', 'ddd', 9), 
 ('K1', 'aaa', 6), 
 ('K1', 'bbb', 3)]

如果您愿意将
rdd
转换为数据帧,则可以定义一个窗口,按
键进行分区,并按
值进行排序。使用此窗口计算行号,并拾取行号小于或等于3的行

import pyspark.sql.functions as f
import pyspark.sql.Window

w = Window.partitionBy("key").orderBy(f.col("value").desc())

rdd.toDF(["key", "String", "value"])\
    .select("*", f.row_number().over(w).alias("rowNum"))\
    .where(f.col("rowNum") <= 3)\
    .drop("rowNum")
    .show()
导入pyspark.sql.f函数
导入pyspark.sql.Window
w=Window.partitionBy(“key”).orderBy(f.col(“value”).desc())
toDF([“键”、“字符串”、“值”])\
.select(“*”,f.行号()。在(w.别名(“rowNum”)上方)\

。where(f.col(“rowNum”)相关:谢谢pault,这是一个很好的答案,但使用数据帧不是一个选项。