使用 IN 子句过滤 Spark Cassandra 连接器
Spark Cassandra connector filtering with IN clause
我在 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子句?如何指定范围查询?
只是想知道,您上面的 Spark 代码是否有效?我认为 Spark 不允许在分区键上使用 WHERE
(在您的情况下为 a
和 b
),因为它在后台使用它们(请参阅此问题的最后一个答案): Spark Datastax Java API Select statements
在任何情况下,使用 Cassandra Spark 连接器,您都可以堆叠 WHERE
子句,并且可以使用 List<String>
.[=20= 指定 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();
}
});
我在 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子句?如何指定范围查询?
只是想知道,您上面的 Spark 代码是否有效?我认为 Spark 不允许在分区键上使用 WHERE
(在您的情况下为 a
和 b
),因为它在后台使用它们(请参阅此问题的最后一个答案): Spark Datastax Java API Select statements
在任何情况下,使用 Cassandra Spark 连接器,您都可以堆叠 WHERE
子句,并且可以使用 List<String>
.[=20= 指定 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();
}
});