Spark cassandra连接器直接联接不适用于IN查询

Spark cassandra连接器直接联接不适用于IN查询,cassandra,datastax-java-driver,spark-cassandra-connector,Cassandra,Datastax Java Driver,Spark Cassandra Connector,我在cassandra中有一个表,其中A(String)和B(int)是部分键 我正在用spark sql编写sql查询 select ("SELECT * from table where A IN ("221",...) and B IN(32,323...)); 在Explain计划中,它似乎在对分区键执行批处理扫描,而不是直接连接 == Physical Plan == Project [A,B ... other columns] +- BatchSca

我在cassandra中有一个表,其中A(String)和B(int)是部分键 我正在用spark sql编写sql查询

select ("SELECT * from table where A IN ("221",...) and B IN(32,323...));
在Explain计划中,它似乎在对分区键执行批处理扫描,而不是直接连接

== Physical Plan ==
Project [A,B ... other columns]
+- BatchScan[A,B ... other columns] Cassandra Scan: dev.table
  • 卡桑德拉滤波器:[[“A”在(
  • 请求的列:[A,B…]
也在文件中 spark.cassandra.sql.InclauseToJoinConversionReshold设置为25


我很好奇是否会有任何情况下,主键上的in子句比直接连接更好

已经有一段时间没有使用Cassandra和Spark了,但考虑到Cassandra中的键空间结构,这并没有那么令人困惑。 Cassandra通过哈希分区键将行分配到正确的碎片。因此,如果查询许多不同的分区,批扫描可能会更快。我想,如果您对表使用另一个模式并将分区键移动到列键,那么您只需对数据库本身使用筛选或范围操作,就可以得到更理想的结果和更好的性能。将所有结果映射到一起,您就可以得到结果。

这对我很有用

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*模式不匹配,则转换可能无法工作。另外,请注意,IncluseToJoinConversionReshold基于IN值的叉积。我查询中的叉积是20

对于值较小的跨积,In子句查询可能比直接联接更有效。默认值(2500)有点太高,将来可能会降低


如果这不起作用,我需要查看您的模式、您发布的确切查询以及SCC/Spark版本。

非常感谢。但是您计划提到“BatchScan”,我希望其中包含DirectScan单词。在哪些情况下,批处理扫描比直接扫描更有效?考虑到我们有很多分区。。您能否详细说明该名称可能有误导性,但在引擎盖下Spark Cassandra连接器执行直接连接,即许多点查询。如果点查询的数量非常多,则全表扫描可能更有效。重申:-SCC执行一次查询,将IN谓词向下推至IncluseToJoinConversionReshold-对(IncluseToJoinConversionReshold,IncluseToFullScanConversionReshold)范围执行直接连接-如果跨越了IncluseToFullScanConversionReshold,则执行完整表扫描