add*_*ing 2 cassandra apache-spark spark-cassandra-connector spark-dataframe
给定 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)
)
Run Code Online (Sandbox Code Playgroud)
以下查询是有效查询:
select * from data_storage.test_table_filtering where id=4 and text_id='2';
Run Code Online (Sandbox Code Playgroud)
因为我包含了从分区键到查询的所有列。
考虑以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
由于 spark-cassandra 连接器将谓词推送到 Cassandra,我希望 Spark 将发送 Cassandra 的查询类似于
SELECT "id", "text_id", "clustering", "some_other" FROM "data_storage"."stack_overflow_test_table" WHERE "id" = ? AND "text_id" = ?
Run Code Online (Sandbox Code Playgroud)
但是,我可以在日志中看到
18/04/09 15:38:09 TRACE Connection:Connection[localhost/127.0.0.1:9042-2, inFlight=1, closed=false],stream 256,写请求 PREPARE SELECT "id", "text_id", "聚类”,“some_other”来自“data_storage”。“stack_overflow_test_table”WHERE“id”=?和“text_id”=?允许过滤
这意味着 spark-cassandra-connector 添加了 ALLOW FILTERING 来查询
因此我有两个问题:
Cassandra 允许过滤的连接器文档是隐式添加的。见这里。请注意它如何警告并非所有谓词都适用于实际数据库。
“这会影响性能吗?”
文档说:
注意:虽然 ALLOW FILTERING 子句被隐式添加到生成的 CQL 查询中,但目前并非所有谓词都被 Cassandra 引擎所允许。这个限制将在未来的 Cassandra 版本中得到解决。目前,ALLOW FILTERING 适用于由聚集列索引的列。
我读这个是因为隐含的结果不会影响性能 allow filtering
“有解决办法吗?”
使查询更快或防止'allow filtering'发送查询的解决方法?简单的答案是不需要“解决方法”。发送一个对 Cassandra 进行高效查询的谓词,就像您的情况一样,数据库引擎将选择最佳执行计划。
| 归档时间: |
|
| 查看次数: |
2671 次 |
| 最近记录: |