鉴于Cassandra表:
CREATE TABLE data_storage.stack_overflow_test_table (
id int,
text_id text,
clustering date,
some_other text,
PRIMARY KEY (( id, text_id ), clustering)
)
以下查询是有效查询:
select * from data_storage.test_table_filtering where id=4 and text_id='2';
因为我将分区键中的所有列都包含在查询中 .
考虑以下代码:
val ds = session.
read
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "stack_overflow_test_table", "keyspace" -> "data_storage"))
.load()
.where(col("id") === 4 &&
col("text_id") === "2").show(10)
由于spark-cassandra连接器将谓词推送到Cassandra,我希望Spark会发送Cassandra的查询类似于
SELECT "id", "text_id", "clustering", "some_other" FROM "data_storage"."stack_overflow_test_table" WHERE "id" = ? AND "text_id" = ?
但是,我可以在日志中看到
18/04/09 15:38:09 TRACE连接:连接[localhost / 127.0.0.1:9042-2,inFlight = 1,关闭= false],流256,写请求PREPARE SELECT“id”,“text_id”, “clustering”,“some_other”FROM“data_storage” . “stack_overflow_test_table”WHERE“id”=? AND“text_id”=?允许过滤
That means spark-cassandra-connector adds ALLOW FILTERING to query
因此我有两个问题:
-
这会影响性能吗?
-
有解决方法吗?
1 回答
隐含地添加了允许过滤的Cassandra连接器文档 . 见here . 请注意它是如何警告并非所有谓词都与实际数据库一致 .
文件说:
我读了这个,因为性能不会因为隐含
allow filtering
而受到影响更快地进行查询或阻止发送_2543397的解决方法?简单的答案是,不需要"workaround" . 发送一个对Cassandra进行高效查询的谓词,就像你的情况一样,数据库引擎将选择最佳的执行计划 .