Спарк Редуктиккей возвращает y - PullRequest
0 голосов
/ 06 марта 2020

У меня есть набор данных

1, india, delhi
2, chaina, bejing
3, russia, mosco
2, england, London

Когда я выполняю

df.map(rec => (rec.split(",")(0).toInt, rec))
  .reduceByKey((x,y)=> y)
  .map(rec => rec._2)
  .foreach {println }

Код выше возвращается ниже вывода. Обычно reducebykey работает как накопленное значение и текущее значение для суммирования значений одного и того же ключа, но здесь, как это работает внутри. Какое значение х и какое значение у. И как это возвращается у

1, india, delhi
2, chaina, bejing
3, russia, mosco

1 Ответ

2 голосов
/ 07 марта 2020

Re: «Какое значение х и какое значение у», вы можете распечатать, чтобы увидеть их значения. Убедитесь, что вы просматриваете журналы исполнителя, а не драйвер, чтобы увидеть этот оператор печати. Более того, запустите его несколько раз, чтобы увидеть, дают ли они одинаковые значения для x и y каждый раз. Я не думаю, что порядок чтения записей гарантирован. Это может быть неочевидно с четырьмя записями, с которыми вы тестируете выше.

df.map(rec => (rec.split(",")(0).toInt, rec)) .reduceByKey((x,y)=> {println(s"x:$x,y:$y");y}) .map(rec => rec._2) .foreach {println }

Re: «как это работает внутри» ReduceByKey объединяет значения для ключа на основе данной функции. Эта функция сначала запускается локально на каждом разделе. Выходные данные для каждого раздела затем перетасовываются на основе ключей, а затем выполняется другая операция сокращения. Это похоже на функцию объединителя в Map-Reduce. Это помогает в меньшем количестве данных, необходимых для перемешивания. Обычно это используется вместо groupByKey (), что приводит к тасованию в начале, а затем у вас есть возможность поработать со значениями для ключей.

Прикрепив пару изображений здесь, чтобы продемонстрировать это.

  • lowerByKey

reduceByKey

  • groupByKey

groupByKey

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...