Вы можете сначала сэмплировать разделы, а затем сэмплировать их. Таким образом, вам не нужно полное сканирование таблицы, но она работает только в том случае, если само разбиение является случайным. AFAIK, вам нужно использовать RDD API для этого. Это может выглядеть так (вставьте числа, соответствующие желаемому количеству образцов):
аюсь выполнить простую случайную выборку со Scala из существующей таблицы, содержащей около 100e6 записей.
import org.apache.spark.sql.SaveMode
val nSamples = 3e5.toInt
val frac = 1e-5
val table = spark.table("db_name.table_name").sample(false, frac).limit(nSamples)
(table
.write
.mode(SaveMode.Overwrite)
.saveAsTable("db_name.new_name")
)
Но это занимает слишком много времени (~ 5 часов по моим оценкам).
Полезная информация:
У меня ~ 6 рабочих. Анализируя количество разделов таблицы я получаю:11433
.
Я не уверен, разумно ли соотношение разделов и рабочих.
Я использую Spark 2.1.0, используя Scala.
Я пытался:
Удаление.limit()
часть.
измененияfrac
в1.0
, 0.1
, и т.д.
Вопрос: как я могу сделать это быстрее?
Лучший,