Образец искры слишком медленный - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь выполнить простую случайную выборку с помощью 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 часов).

Полезная информация:

  1. У меня ~ 6 работников.Анализируя количество разделов таблицы, я получаю: 11433.

  2. Я не уверен, является ли соотношение разделов / работников разумным.

  3. Я использую Spark 2.1.0 с использованием Scala.

Я пробовал:

  1. Удаление части .limit().

  2. Изменение frac на 1.0, 0.1 и т. Д.

Вопрос: как я могу сделать это быстрее?

Бест,

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

вы можете сначала сэмплировать разделы, а затем сэмплы из разделов.Таким образом, вам не нужно полное сканирование таблицы, но она работает только в том случае, если само разбиение является случайным.AFAIK, вам нужно использовать RDD API для этого.Это может выглядеть так (введите числа, соответствующие желаемому количеству образцов):

val ds : Dataset[String] = ???

  val dsSampled = ds.rdd
  // take 1000 samples from every 10th partition
  .mapPartitionsWithIndex{case (i,rows) => if(i%10==0) scala.util.Random.shuffle(rows).take(1000) else Iterator.empty}
  .toDS()
0 голосов
/ 24 апреля 2018

Лимит определенно стоит убрать, но реальная проблема заключается в том, что выборка требует полного сканирования данных.Независимо от того, насколько мала доля, временная сложность все равно составляет O (N) *.

Если вам не нужны хорошие статистические свойства, вы можете попытаться ограничить объем загружаемых данных, сначала выбрав файлы данных, а затем подвыбор из уменьшенного набора данных.Это может работать достаточно хорошо, если данные распределены равномерно.

В противном случае вы ничего не можете с этим поделать, кроме масштабирования вашего кластера.


* Как это сделатьРаботает ли в Apache Spark (Scala) функция простой случайной выборки и выборки данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...