Как найти максимальное значение, используя операцию pyspark fold в следующем примере? - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в pyspark и python. Поэтому, пожалуйста, помогите мне с этой проблемой, где мне нужно найти максимальное значение, используя fold и используя operator.gt или написав нашу собственную функцию lambda.

Следующий код, написанный мной, выдает ошибку, что rdd не может быть проиндексирован. Я понял это, но как передать и сравнить значения каждого значения 1,2,0,3 с 0 и найти макс. Здесь 0 - значение моего аккумулятора, а 1,2,0,3 - текущие значения каждый раз. Я пытаюсь преобразовать программу, написанную на Scala, которая объясняет сложение в Python. Ожидаемый ответ: ('d', 3)

from pyspark import SparkContext
from operator import gt

def main():
    sc = SparkContext("local", "test")

    data = sc.parallelize([('a', 1), ('b', 2),('c', 0), ('d', 3)])

    #dummy = ('dummy', 0)

    maxVal = data.fold(0, lambda acc, a : gt(acc, a[1])).collect()

    print(maxVal)


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 09 ноября 2018
  • Используйте нейтральное значение (то, которое можно объединять произвольное количество раз без изменения конечного результата), подходящее для конкретной операции и соответствующее типу данных (функция должна быть (T, T) => T или с соглашениями Python Callable[[T, T], T]). С max по значению имеет смысл использовать float("-Inf") и фиктивный ключ:

    zero = (None, float("-Inf"))
    
  • Для уменьшения используйте max с key:

    from functools import partial
    from operator import itemgetter
    
    op = partial(max, key=itemgetter(1))
    

Комбинированный:

data.fold(zero, op)
('d', 3) 

Конечно, на практике вы можете просто использовать RDD.max

data.max(key=itemgetter(1))
('d', 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...