0

После нескольких дней размышлений об этом я все еще придерживаюсь этой проблемы: у меня есть одна таблица, где «timestamp» - это ключ раздела. Эта таблица содержит миллиарды строк.Spark-Cassandra: как эффективно ограничивать разделы

У меня также есть таблицы «временные ряды», которые содержат временные метки, связанные с конкретными процессами измерения.

С Spark Я хочу проанализировать содержимое большой таблицы. Конечно, неэффективно выполнять полное сканирование таблицы, и с довольно быстрым поиском в таблице timeseries я должен иметь возможность настраивать только, скажем, 10 тыс. Разделов.

Что является наиболее эффективным способом достижения этого?

Является SparkSQL достаточно умны, чтобы оптимизировать что-то вроде этого

sqlContext.sql(""" 
    SELECT timeseries.timestamp, bigtable.value1 FROM timeseries 
    JOIN bigtable ON bigtable.timestamp = timeseries.timestamp 
    WHERE timeseries.parameter = 'xyz' 
""") 

В идеале я хотел бы ожидать Cassandra для извлечения временных отметок из timeseries таблицы, а затем использовать, чтобы запросить только то подмножество разделов из bigtable.

ответ

1

Я могу только угадать оптимизацию, выполняемую драйвером, но я бы наверняка ожидал такого запроса, который бы ограничивал JOIN на WHERE, а это означает, что ваш простой запрос будет оптимизирован.

То, что я сделаю, также указывает на общее направление оптимизации Spark SQL. Посмотрите на Catalyst для Spark SQL, который является инструментом для значительно оптимизирует запросы вплоть до физического уровня.

Вот расстройство того, как он работает: Deep Dive into Spark SQL Catalyst Optimizer

И ссылка на GIT-репозиторий: Catalyst repo

2

Если добавить «Объяснить» вызов на ваш запрос, вы увидите, что в Планировщик Catalyst сделает для вашего запроса, но я знаю, что он не будет делать нужные вам оптимизации.

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

Read Data From Table timeseries with predicate parameter = 'xyz' 
Read Data From Table bigtable 
Join these two results 
Filter on bigtable.timestamp == timeseries.timestamp 

Искра Cassandra Соединитель будет дан предикат из timeseries читаемой таблицы, и будет иметь возможность оптимизировать его, если это ключ кластеризации или ключевой раздел. См. the Spark Cassandra Connector Docs. Если он не вписывается в одну из этих категорий спуска, для этого потребуется полноэкранное сканирование с последующим фильтром в Spark.

Поскольку данные чтения из таблицы bigtable не имеет никаких ограничений на это, Spark проинструктирует соединитель прочитать всю таблицу (сканирование полной таблицы).

+0

Спасибо за объяснение. Я где-то читал (слайды от вас?), Что соединитель будет расширен до «автоматически», «joinwithcassandratable» и 'repartitionbyrepllica', это все еще план? Если да, значит ли это, что Catalyst сможет также выполнить такую ​​оптимизацию? –

+1

Это наоборот, Catalyst должен сначала поддержать его, прежде чем мы сможем сделать эту стабильную функцию для Dataframes. Проверьте https://issues.apache.org/jira/browse/SPARK-12449?filter=-3 – RussS

Смежные вопросы