如何使用spark RDD操作获得防御力最大的所有神奇宝贝?

问题描述 投票:0回答:3

我尝试使用 Spark RDD 操作找到所有具有最高防御值的神奇宝贝,但我只找到了 3 个具有最高防御值的神奇宝贝中的一个。有没有办法只使用 RDD 操作来获得所有 3 个?神奇宝贝数据集可以从神奇宝贝数据下载。 [PS:我需要找到一种方法在事先不知道有 3 个的情况下获得它们]。

from pyspark import SparkContext, SparkConf
conf = SparkConf().setAppName("trial").setMaster("local")
sc = SparkContext(conf=conf)
input = "Pokemon.csv"
lineRDD = sc.textFile(input)
poke_def = lineRDD.map(lambda line : tuple(line.split(',')[i] for i in {1,7}) if line.split(',')[0].isdigit() else ('','0'))
poke_def.reduce(lambda x,y: x if int(x[1]) >= int(y[1]) else y)

我也尝试过直接使用 max 函数而不是 reduce,但这也只返回一个 Pokémon。

printList(poke_def.max(lambda x: int(x[1])))
python apache-spark rdd
3个回答
0
投票

我想我在其他答案中并没有真正理解你的问题。我不会删除它,因为它也很有用。

如果您想获得所有防御力最高的神奇宝贝,但不知道它们有多少,您可以这样做:

>>> poke_def_int = poke_def.mapValues(int)
>>> max_defense = poke_def_int.values().max()
>>> best_defense_pokemonRDD = poke_def_int.filter(lambda x: x[1] == max_defense)
>>> best_defense_pokemonRDD.collect()
[('SteelixMega Steelix', '230'), ('Shuckle', '230'), ('AggronMega Aggron', '230')]

0
投票

可以使用方法

.top
:

>>> poke_def.top(3, key=lambda x: int(x[1]))
[('SteelixMega Steelix', '230'), ('Shuckle', '230'), ('AggronMega Aggron', '230')]

key
参数指定rdd将如何排序。在您的情况下,您希望通过防御对其进行排序(
x[1]
),并且由于默认情况下它是一个字符串,因此您必须将其转换为数字值才能进行正确的排序:
int(x[1])


-2
投票

使用Spark RDD操作获得最大防御力的所有神奇宝贝:

Pokémon 数据加载到 RDD 中。 映射 RDD 以提取防御值。 求最大防御值。 过滤 RDD 以仅保留具有最大防御力的神奇宝贝。

© www.soinside.com 2019 - 2024. All rights reserved.