Какой самый быстрый способ получить большое количество временных диапазонов с помощью Apache Spark? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть около 100 ГБ данных временных рядов в Hadoop.Я бы хотел использовать Spark для сбора всех данных из 1000 различных временных интервалов.

Я попробовал это с помощью Apache Hive, создав чрезвычайно длинный SQL-оператор, содержащий около 1000 'OR BETWEEN X AND Y OR BETWEEN Q AND R' операторов.

Я также пытался использовать Spark.В этой технике я создал фрейм данных с указанными временными диапазонами и загрузил его в spark с:

spark_session.CreateDataFrame()

и

df.registerTempTable()

С этим я делаюприсоединиться к вновь созданному фрейму данных метки времени и большему набору данных с метками времени.

Этот запрос занимает очень много времени, и мне интересно, есть ли более эффективный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Особенно, если данные не разбиты на разделы или не упорядочены каким-либо особым образом, вам или 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, сначала соберите ее обратно в драйвер, если не слишком большой.

0 голосов
/ 01 июня 2018

Ваша работа Spark проходит через набор данных объемом 100 ГБ, чтобы выбрать соответствующие данные.Я не думаю, что есть большая разница между использованием SQL или API фрейма данных, так как в любом случае полное сканирование происходит.

Я бы подумал о реструктуризации ваших данных, поэтому они оптимизированы для конкретных запросов.

В ваших случаях разделение по времени может дать довольно значительное улучшение (например, таблица HIVE с разделением).Если вы выполняете поиск по тому же полю, которое использовалось для разбиения на разделы - задание Spark просматривает только соответствующие разделы.

...