Прямое соединение соединителя Spark cassandra не работает для запросов IN - PullRequest
1 голос
/ 04 августа 2020

У меня есть таблица в кассандре, где A (String) и B (int) вместе являются ключами разделения. Я пишу sql запрос в искре sql

select ("SELECT * from table where A IN ("221",...) and B IN(32,323...));

В плане объяснения это кажется выполнение пакетного сканирования вместо прямого соединения на ключах разделов

== Physical Plan ==
Project [A,B ... other columns]
+- BatchScan[A,B ... other columns] Cassandra Scan: dev.table
  • Фильтры Cassandra: [["A" IN (?,?,?,?), D], ["B" IN ( ?,?,?,?,?,?,?,?,?,?), D]]
  • Запрошенные столбцы: [A, B ...]

Также в документации https://github.com/datastax/spark-cassandra-connector/blob/master/doc/reference.md spark.cassandra. sql .inClauseToJoinConversionThreshold установлено на 25 ..

Мне было любопытно, будет ли какой-либо сценарий, в котором предложение In по первичному ключу работает лучше, чем прямое соединение

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Это работает для меня

cqlsh> CREATE TABLE IF NOT EXISTS test.tab4 (k1 varchar, k2 int, PRIMARY KEY (k1, k2));

bin/spark-shell --packages com.datastax.spark:spark-cassandra-connector_2.12:3.0.0-beta --conf spark.cassandra.sql.inClauseToJoinConversionThreshold=10

scala> spark.conf.set(s"spark.sql.catalog.mycatalog", "com.datastax.spark.connector.datasource.CassandraCatalog")
scala> spark.sql("""SELECT * FROM mycatalog.test.tab4 where k1 in ("1","2","3","4") and k2 in (3,4,5,6,7)""").explain
== Physical Plan ==
*(1) Project [k1#43, k2#44]
+- BatchScan[k1#43, k2#44] class com.datastax.spark.connector.datasource.CassandraInJoin

Преобразование может не работать, если типы, используемые в предикатах, не соответствуют схеме C*. Также обратите внимание, что inClauseToJoinConversionThreshold основан на перекрестных произведениях значений IN. Перекрестное произведение в моем запросе равно 20.

Запрос в предложении может быть более производительным, чем прямое соединение, только для перекрестных произведений небольших значений IN. Значение по умолчанию (2500) слишком велико и может быть уменьшено в будущем.

Если это не поможет, мне нужно будет увидеть вашу схему, точный запрос, который вы отправили, и версии SCC / Spark.

0 голосов
/ 05 августа 2020

Давно не работал над Cassandra и Spark, но это не так уж и запутанно, учитывая структуру пространства ключей в Cassandra. Cassandra распределяет строки по правильным шардам с помощью хешированного ключа раздела. Следовательно, если вы запрашиваете много разных разделов, сканирование партии может быть еще быстрее. Я предполагаю, что вы получите более желаемый результат и лучшую производительность, если вы используете другую схему для своих таблиц и переместите ключ раздела в ключ столбца, поэтому вам просто нужно использовать операции фильтрации или диапазона в самой базе данных. Сопоставьте все результаты вместе, и вы получите свой результат.

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