Cassandra - 根据范围过滤行

时间:2014-12-10 22:25:04

标签: filter cassandra apache-spark

使用cassandraspark以及datastax' s spark-cassandra-connector

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

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

基本上它会使用color过滤black列。但是,我可以根据范围过滤行吗?我希望过滤rangelong类型,range列在100000200000之间? cql是否支持这样的范围过滤器?

1 个答案:

答案 0 :(得分:6)

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

.where("my_long >= ? and my_long < ?", 1L, 100L)

只要&#34; my_long&#34; column是第一个聚类列。聚类列是在主键中声明分区列之后的列。

例如,如果主键声明如下,则可以在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) - &gt; .where(&#34; pk2 =?和my_long&gt;?和my_long
  • PRIMARY KEY(pk1,pk2,pk3,my_long) - &gt; .where(&#34; pk2 =?和pk3 =?和my_long&gt;?和my_long
  • PRIMARY KEY((pk1,pk2),pk3,my_long) - &gt; .where(&#34; pk3 =?和my_long&gt;?和my_long
  • PRIMARY KEY((pk1,pk2),pk3,my_long,pk5) - &gt; .where(&#34; pk3 =?和my_long&gt;?和my_long

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