Python 2.7 为Spark中RDD中的每个键获取前3个值
我是Spark的初学者,我正在尝试创建一个RDD,其中包含每个键的前3个值(而不仅仅是前3个值)。我当前的RDD包含以下格式的数千个条目: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"
(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,这是一个很好的答案,但使用数据帧不是一个选项。