Как я могу разделить RDD в соответствии с порядком? - PullRequest
0 голосов
/ 26 мая 2019

Я хотел бы разделить СДР на количество разделов, соответствующее количеству различных ключей, которые я нашел (в данном случае 3):

СДР: [(1,a), (1,b), (1,c), (2,d), (3,e), (3,f), (3,g), (3,h), (3,i)]

Теперь я делаю, что элементы с одинаковым ключом попадают в один и тот же раздел:

[(1,a), (1,b), (1,c)]
[(2,d)]
[(3,e), (3,f), (3,g), (3,h), (3,i)]

Вот как я делю

val partitionedRDD = rdd.partitionBy(new PointPartitioner(
     rdd.keys.distinct().count().asInstanceOf[Int]))

Это класс PoinPartitioner

class PointPartitioner(numParts: Int) extends org.apache.spark.Partitioner{

import org.apache.spark.Partitioner
  override def numPartitions: Int = numParts

  override def getPartition(key: Any): Int = {
    key.hashCode % numPartitions
  }

  override def equals(other: Any): Boolean = other match
  {
    case dnp: PointPartitioner =>
      dnp.numPartitions == numPartitions
    case _ =>
      false
  }
}

Однако элементы разбалансированы по разделам. Я хотел бы получить RDD-раздел, подобный этому, где все разделы содержат примерно одинаковое количество элементов, соблюдая порядок ключей:

[(1,a), (1,b), (1,c)]
[(2,d), (3,e), (3,f)]
[(3,g), (3,h), (3,i)]

Что я мог попробовать?

1 Ответ

2 голосов
/ 26 мая 2019

Назначение разделов следующим образом

p1 [(1,a), (1,b), (1,c)]
p2 [(2,d), (3,e), (3,f)]
p3 [(3,g), (3,h), (3,i)]

будет означать, что вы хотите назначить один и тот же ключ раздела для разных разделов (для 3 это p2 или p3).Так же, как для математических функций, он не может иметь много значений для одного и того же аргумента (от чего зависит значение?)(эффективно разбивая один набор на меньшие наборы).Но вы не можете (фактически) контролировать, как Spark размещает ваши разделы на узлах, чтобы данные, которые вы хотели разместить на одном узле, могли распределяться по нескольким узлам.

Это действительно сводится к тому, какую работу вы бы выполнялинравится выполнять.Я бы порекомендовал подумать, какой результат вы хотите получить, и посмотреть, сможете ли вы придумать какой-нибудь умный ключ раздела с разумным компромиссом (если это действительно необходимо).Может быть, вы могли бы удерживать значения буквой и затем использовать такие операции, как reduceByKey, а не groupByKey, чтобы получить окончательные результаты?

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