Я пытаюсь понять новый API внешнего источника данных. Скажем, у меня есть 3 источника данных, у которых есть столбец BC. Я хочу создать такие разделы, чтобы данные из всех источников данных, которые имеют одинаковое значение для столбца bc, загружались на тот же компьютер. Любое предложение приветствуется.

С уважением

0
user2799564 7 Мар 2015 в 19:23

2 ответа

Лучший ответ

Как я прокомментировал ответ @G Quintana, я не думаю, что можно гарантировать, что раздел, содержащий значения для данного значения BC (скажем, BC1) в первом источнике данных, будет помещен на того же рабочего, что и раздел, содержащий BC1 во втором или третьем источнике данных, потому что вы не можете указать, как разделы назначаются физическим узлам.

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

Более того, я бы посоветовал использовать другой подход для перераспределения, чем тот, который предлагает @G Quintana, а именно: напишите свой собственный Partitioner, как описано здесь https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html в этой главе Пользовательские разделители . Таким образом, вам не нужно будет создавать PairRDD, но вы можете просто перераспределить свой RDD по своему усмотрению.

-1
mgaido 8 Мар 2015 в 09:28

Я предлагаю вам что-то вроде

// Convert your RDD into a (Key,Value) PairRDD val dataByBc=data.map(row => (row.getBc(), row)) // Repartition val dataByBcPart = dataByBc.partitionBy(HashPartitioner(1000))

-1
G Quintana 7 Мар 2015 в 19:51