Я пытаюсь понять новый API внешнего источника данных. Скажем, у меня есть 3 источника данных, у которых есть столбец BC. Я хочу создать такие разделы, чтобы данные из всех источников данных, которые имеют одинаковое значение для столбца bc, загружались на тот же компьютер. Любое предложение приветствуется.
С уважением
2 ответа
Как я прокомментировал ответ @G Quintana, я не думаю, что можно гарантировать, что раздел, содержащий значения для данного значения BC (скажем, BC1) в первом источнике данных, будет помещен на того же рабочего, что и раздел, содержащий BC1 во втором или третьем источнике данных, потому что вы не можете указать, как разделы назначаются физическим узлам.
Единственный способ добиться этого, на мой взгляд, - это создать новый RDD, который представляет собой объединение трех источников, и перераспределить полученный RDD.
Более того, я бы посоветовал использовать другой подход для перераспределения, чем тот, который предлагает @G Quintana, а именно: напишите свой собственный Partitioner
, как описано здесь https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/ch04.html в этой главе Пользовательские разделители . Таким образом, вам не нужно будет создавать PairRDD
, но вы можете просто перераспределить свой RDD по своему усмотрению.
Я предлагаю вам что-то вроде
// Convert your RDD into a (Key,Value) PairRDD
val dataByBc=data.map(row => (row.getBc(), row))
// Repartition
val dataByBcPart = dataByBc.partitionBy(HashPartitioner(1000))
Похожие вопросы
Новые вопросы
apache-spark
Apache Spark - это механизм распределенной обработки данных с открытым исходным кодом, написанный на Scala, предоставляющий пользователям унифицированный API и распределенные наборы данных как для пакетной, так и для потоковой обработки. Варианты использования Apache Spark часто связаны с машинным / глубоким обучением и обработкой графиков.