使用IN子句

时间:2015-06-25 10:45:16

标签: java cassandra apache-spark cql spark-cassandra-connector

我正面临着针对java的spark cassandra连接器过滤的一些问题。 Cassandra允许使用IN子句过滤分区键的最后一列。 e.g

create table cf_text
(a varchar,b varchar,c varchar, primary key((a,b),c))

Query : select * from cf_text where a ='asdf' and b in ('af','sd');

sc.cassandraTable("test", "cf_text").where("a = ?", "af").toArray.foreach(println)

我如何计算在spark中的CQL查询中使用的IN子句?如何指定范围查询?

1 个答案:

答案 0 :(得分:4)

只是想知道,但上面的Spark代码是否正常工作?我认为Spark不会允许WHERE分区键(在您的情况下为ab),因为它在引擎盖下使用它们(请参阅此问题的最后一个答案) ):Spark Datastax Java API Select statements

在任何情况下,使用Cassandra Spark连接器,您都可以叠加WHERE个子句,并且可以使用IN指定List<String>

List<String> valuesList = new ArrayList<String>();
valuesList.Add("value2");
valuesList.Add("value3");

sc.cassandraTable("test", "cf")
    .where("column1 = ?", "value1")
    .where("column2 IN ?", valuesList)
    .keyBy(new Function<MyCFClass, String>() {
                public String call(MyCFClass _myCF) throws Exception {
                    return _myCF.getId();
                }
            });

请注意normal rules of using IN with Cassandra/CQL仍然适用于此。

范围查询以类似的方式运行:

sc.cassandraTable("test", "person")
    .where("age > ?", "15")
    .where("age < ?", "20")
    .keyBy(new Function<Person, String>() {
                public String call(Person _person) throws Exception {
                    return _person.getPersonid();
                }
            });