Cassandra - 根据范围过滤行

chr*_*ina 1 filter cassandra apache-spark

使用cassandraand sparkdatastax's spark-cassandra-connector.

spark-cassandra-connector中,它支持这样的过滤器示例:

sc.cassandraTable("test", "cars").select("id", "model").where("color = ?", "black").toArray.foreach(println)
Run Code Online (Sandbox Code Playgroud)

基本上它用过滤colorblack.但是,我可以根据范围过滤行吗?就像我想过滤range一个long类型的列,并range100000和之间200000?是否cql支持这样的范围过滤器?

Nic*_*aro 6

CQL仅支持对群集列进行范围查询.范围查询可以在SQL中通过在同一个字段上使用两个边界条件来表示,例如,在您将编写的spark-cassandra-connector中:

.where("my_long >= ? and my_long < ?", 1L, 100L)
Run Code Online (Sandbox Code Playgroud)

只要"my_long"列是第一个聚类列,这将起作用.聚类列是在主键中声明分区列之后的列.

例如,如果主键声明如下,则可以在my_long列上运行范围查询:

  • PRIMARY KEY(pk1,my_long)
  • PRIMARY KEY(pk1,my_long,pk3)
  • PRIMARY KEY((pk1,pk2),my_long)
  • PRIMARY KEY((pk1,pk2),my_long,pk4)
  • ...

如您所见,在上述所有情况中,my_long都遵循主键中分区键的声明.如果列属于聚类列但不是第一列,则必须为所有前面的列提供相等条件.例如:

  • PRIMARY KEY(pk1,pk2,my_long) - > .where("pk2 =?and my_long>?and my_long
  • PRIMARY KEY(pk1,pk2,pk3,my_long) - > .where("pk2 =?和pk3 =?and my_long>?and my_long
  • PRIMARY KEY((pk1,pk2),pk3,my_long) - > .where("pk3 =?and my_long>?and my_long
  • PRIMARY KEY((pk1,pk2),pk3,my_long,pk5) - > .where("pk3 =?and my_long>?and my_long

注意:spark-cassandra-connector默认在所有查询中添加"ALLOW FILTERING"子句.如果您尝试在cqlsh中运行上面的示例,则必须手动指定该子句.