Я бы порекомендовал вам использовать следующий подход источник Блог Рассела Спитцера
Разделение разделов вручную с помощью объединения частичных сканирований: Передача задачи конечному пользователю также является возможностью (и текущим обходным путем). Большинство конечных пользователей уже понимают, почему у них длинные разделы, и в целом знают домен, в который попадают значения столбцов. Это позволяет им вручнуюразделите запрос так, чтобы он разбивал большие разделы.
Например, предполагая, что пользователь знает, что столбец кластеризации c охватывает интервалы от 1 до 1000000. Они могли бы написать код, подобный
val minRange = 0
val maxRange = 1000000
val numSplits = 10
val subSize = (maxRange - minRange) / numSplits
sc.union(
(minRange to maxRange by subSize)
.map(start =>
sc.cassandraTable("ks", "tab")
.where("c > $start and c < ${start + subSize}"))
)
Каждый СДРбудет содержать уникальный набор задач, рисующий только части полных разделов.Операция объединения объединяет все эти разрозненные задачи в один СДР.Максимальное количество строк, которое любой отдельный раздел Spark будет извлекать из одного раздела Cassandra, будет ограничено maxRange / numSplits.Этот подход, хотя и требует вмешательства пользователя, сохранит локальность и все же сведет к минимуму скачки между секторами диска.
Также параметры чтения-настройки