У меня есть RDD из 1000 элементов. Я хочу взять из него 100 элементов, а затем удалить эти 100 из исходного RDD. Но я не могу найти способ, попробовав несколько способов.
var part = dataRDD.take(100)
часть является массивом [String]
Я хочу удалить 100 элементов из 100 dataRDD.
var dataRDD = dataRDD.filter(row => row != part)
Вышеупомянутое не показывает никаких ошибок, но не удаляет ни одной строки. dataRDD по-прежнему имеет те же 1000 строк.
Не могли бы вы посоветовать, как получить эту работу.
да. Но мой проект состоит в том, чтобы транслировать RDD по частям. Так что пришлось разделить и RDD.
Вы можете написать так:
var part = sc.parallelize(dataRDD.take(100))
val result = dataRDD.subtract(part)
result.foreach(x => foreach(x))
печать RDD
только в целях тестирования.
Метод "zipWithIndex" можно использовать для разбиения rdd:
val zipped = rdd.zipWithIndex()
val first100 = zipped.filter(_._2 < 100).keys
val remaining = zipped.filter(_._2 >= 100).keys
Потрясающие. Это было именно то, что я хотел. Большое спасибо.
Скорее всего, ваш код работает не так, как вы ожидаете, потому что row != part
всегда является true
. !=
в данном контексте представляет собой сравнение ссылок между массивами из java.
Основные преимущества Spark заключаются в создании неизменяемых структур данных. Вы не должны использовать var.