Особенно, если данные не разбиты на разделы или не упорядочены каким-либо особым образом, вам или Spark нужно сканировать все это независимо от того, что.
Я бы определил предикат, учитывая набор временных диапазонов:
import scala.collection.immutable.Range
val ranges: List[Range] = ??? // load your ranges here
def matches(timestamp: Int): Boolean = {
// This is not efficient, a better data structure than a List
// should be used, but this is just an example
ranges.contains(_.contains(timestamp))
}
val data: RDD[(Int, T)] = ??? // load the data in an RDD
val filtered = data.filter(x => matches(x.first))
Вы можете сделать то же самое с DataFrame / DataSet и UDF.
Это хорошо работает, если в драйвере указан набор диапазонов.Если вместо этого он исходит из таблицы, такой как данные 100G, сначала соберите ее обратно в драйвер, если не слишком большой.