将来自社区的Apache Cassandra专家和DataStax聚集在一起。

想学习吗?有一个问题?想分享您的专业知识吗?你是在正确的地方!

不知道从哪里开始? 入门

 

问题

凯文玛特头像图片
凯文玛特 ·

是否不允许在复合分区键的1列上进行过滤?

嗨,我正在使用Scala版本:2.11 Spark Cassandra连接器:2.3.0

我有一张桌子,像:

CREATE TABLE dcmapp (
    t text,
    p text,
    v double,
    d blob,
    f text,
    i tinyint,
    PRIMARY KEY ((t, p), v )
)

上面包含一个2列分区键。当我想基于列获取行时"t"这是分区键的一部分,例如:

sc.cassandraTable("kevin", "dcmapp").select("t", "p").where("t = ?", "A1").collect().foreach(println)

我收到以下错误:

java.lang.UnsupportedOperationException: Partition key predicate must include all partition key columns or partition key columns need to be indexed. Missing columns: p

如果我按i查询,则查询成功。

是否无法使用部分分区键在连接器中查询。

如果我通过cqlsh触发仅指定列的相同查询"t"在where子句和ALLOW FILTERING中,我得到结果

Spark-Cassandra连接器
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。

1 回答

埃里克·拉米雷斯(Erick Ramirez)头像图片
埃里克·拉米雷斯(Erick Ramirez) 已回答 ·

如异常所示,您需要 指定复合分区键的所有列 在过滤器中。这不是连接器所独有的-因为它不是有效的CQL查询,因此您也将无法在cqlsh中执行此操作。

当您不指定完整分区键时,Cassandra无法检索记录,因为分区程序只能 根据完整分区键的哈希值找到分区。我已经在 问题#5944 如果您有兴趣更详细地了解它。

When you use the ALLOW FILTERING clause, Cassandra is no longer trying to retrieve a single partition. Instead it is performing a full table scan which means that this query doesn't scale when (a) the table is large, (b) the cluster has lots of nodes, or (c) both. Cheers!

2 评论 分享
10 | 1000 所需字符 剩余字符 超出字符

最多可以使用8个附件(包括图像),每个附件最多1.0 MiB,总共10.0 MiB。

感谢Erick的解释。是否可以通过spark Cassandra连接器仅提供部分分区键,并且连接器将后缀ALLOW FILTERING并执行查询

当我尝试使用连接器时,它给出了我提到的错误

0个赞 0 ·

不是,不是,因为不建议使用“允许过滤”。干杯!

0个赞 0 ·