2016-02-14 5 views
2

Схема My Cassandra содержит таблицу с ключом раздела, которая является меткой времени, и столбец parameter, который является ключом кластеризации.Spark SQL и Cassandra JOIN

Каждый раздел содержит 10k + строк. Это протоколирование данных со скоростью 1 раздела в секунду.

С другой стороны, пользователи могут определять «наборы данных», и у меня есть другая таблица, которая содержит в качестве ключа раздела «имя набора данных» и столбца кластеризации, который является меткой времени, относящейся к другой таблице (так что «набор данных» "- это список ключей раздела).

Конечно, то, что я хотел бы сделать, выглядит как анти-шаблон для Кассандры, поскольку я хотел бы присоединиться к двум таблицам.

Однако, используя Spark SQL, я могу запустить такой запрос и выполнить команду JOIN.

SELECT * from datasets JOIN data 
    WHERE data.timestamp = datasets.timestamp AND datasets.name = 'my_dataset' 

Теперь вопрос: является Спарк SQL достаточно умны, чтобы прочитать только разделы data которые соответствуют timestamp с определенными в datasets?

ответ

3

Edit: исправить ответ в отношении оптимизации соединения

искры SQL достаточно умной, чтобы прочитать только разделы данных, которые соответствуют меткам времени, определенных в наборах данных?

Нет. На самом деле, так как вы предоставите ключ разделов для таблицы наборов данных, то/разъем Cassandra Спарк выполнит предикат надавите и выполнить ограничение раздела непосредственно в Кассандре с CQL. Но не будет никакого предиката надавите для самой операции соединения, если вы не используете API RDD с joinWithCassandraTable()

Смотрите здесь для всех возможных сказуемым толкают вниз ситуации: https://github.com/datastax/spark-cassandra-connector/blob/master/spark-cassandra-connector/src/main/scala/org/apache/spark/sql/cassandra/BasicCassandraPredicatePushDown.scala

+1

Вы уверены, что может толкнуть предикаты вида столбец ' = column'? Если да, то вы можете дать некоторую ссылку. Из того, что я видел до сих пор, Spark рассматривает только предикаты формы 'column = value'. – zero323

+2

Оптимизация для соединения отсутствует, но есть предикат push вниз для ** AND datasets.name = 'my_dataset' **. Если вы хотите, чтобы соединитель искры/кассандра оптимизировал соединение, вам нужно использовать программный API RDD (** joinWithCassandraTable **) – doanduyhai

+0

Спасибо. Так что ответ должен быть нет, не так ли? Как жир, как я понимаю, ОП спрашивает о состоянии соединения, а не предикате. – zero323

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