【问题标题】:Why Spark Cassandra connector allows filtering even when if query table by partitiong key using DataFrame API?为什么即使使用 DataFrame API 按分区键查询表,Spark Cassandra 连接器也允许过滤?
【发布时间】:2018-09-18 23:00:48
【问题描述】:

给定 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, closed=false], 流 256, 写入请求 PREPARE SELECT "id", "text_id ", "集群", "some_other" FROM "data_storage"."stack_overflow_test_table" WHERE "id" = ?和“text_id”=?允许过滤

这意味着 spark-cassandra-connector 在查询中添加了 ALLOW FILTERING

因此我有两个问题:

  1. 这会影响性能吗?
  2. 有解决方法吗?

【问题讨论】:

    标签: apache-spark cassandra spark-dataframe spark-cassandra-connector


    【解决方案1】:

    隐式添加了允许过滤的 Cassandra 连接器文档。见here。请注意它如何警告并非所有谓词都与实际数据库一致。

    1. “这会影响性能吗?”

      文档说:

      注意:虽然 ALLOW FILTERING 子句隐式添加到生成的 CQL 查询中,但 Cassandra 引擎目前并不允许所有谓词。这个限制将在未来的 Cassandra 版本中得到解决。目前,ALLOW FILTERING 适用于由集群列索引的列。

      我认为这是因为隐式 allow filtering 不会影响性能

    2. “有解决办法吗?”

      使查询更快或防止发送'allow filtering' 的解决方法?简单的答案是不需要“解决方法”。发送一个对 Cassandra 进行有效查询的谓词,就像您的情况一样,数据库引擎将选择最佳执行计划。

    【讨论】:

    • 你完全正确,如果通过cqlsh跟踪查询,由于隐式ALLOW FILTERING,查询计划不会发生变化
    猜你喜欢
    • 2016-06-04
    • 2020-12-01
    • 2020-07-19
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2021-09-10
    • 2020-12-22
    • 2015-09-11
    相关资源
    最近更新 更多