首页 文章

使用IN子句过滤Spark Cassandra连接器

提问于
浏览
3

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

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 回答

  • 3

    只是想知道,但你的Spark代码上面有效吗?我认为Spark不允许在分区键上使用 WHERE (在你的情况下是 ab ),因为它在引擎盖下使用它们(参见这个问题的最后答案):Spark Datastax Java API Select statements

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

    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();
                    }
                });
    

相关问题