为什么Spark Cassandra连接器允许过滤,即使在使用DataFrame API通过partitiong键查询表时也是如此?

时间:2018-04-09 13:57:17

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

鉴于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 “,”clustering“,”some_other“FROM”data_storage“。”stack_overflow_test_table“WHERE”id“=? AND“text_id”=?允许过滤

这意味着spark-cassandra-connector添加了允许过滤查询

因此我有两个问题:

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

1 个答案:

答案 0 :(得分:4)

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

  1. "这会影响效果吗?"

    文件说:

      

    注意:尽管ALLOW FILTERING子句隐式添加到生成的CQL查询中,但Cassandra引擎当前不允许所有谓词。这种限制将在未来的Cassandra版本中得到解决。目前,ALLOW FILTERING适用于通过聚类列索引的列。

    我读到这一点,因为隐含的allow filtering

  2. 导致表现不会受到影响
  3. "有解决方法吗?"

    提高查询速度或阻止发送'allow filtering'的解决方法?简单的答案是,不需要一个"解决方法"。发送一个对Cassandra进行高效查询的谓词,就像你的情况一样,数据库引擎将选择最佳的执行计划。