Select Cassandra-如何在2个关键列中按范围搜索?
如何在多个键列上按范围搜索? 在我看来,我们不能有一个可能会进入多个分区的查询。 是否有任何可能的解决方案来实现相同的查询结果Select Cassandra-如何在2个关键列中按范围搜索?,select,cassandra,cql,Select,Cassandra,Cql,如何在多个键列上按范围搜索? 在我看来,我们不能有一个可能会进入多个分区的查询。 是否有任何可能的解决方案来实现相同的查询结果 CREATE TABLE RangeSearch (segment TEXT, date TIMESTAMP, dec decimal, value text, PRIMARY KEY (segment,date,dec)); SELECT * FROM decimalrangeck WHERE segment='SEG1' AND date>='2015-
CREATE TABLE RangeSearch (segment TEXT, date TIMESTAMP, dec decimal, value text, PRIMARY KEY (segment,date,dec));
SELECT * FROM decimalrangeck
WHERE segment='SEG1'
AND date>='2015-01-01' AND date<='2015-12-12';
AND dec>=100 AND dec<=200;
创建表范围搜索(段文本、日期时间戳、十进制、值文本、主键(段、日期、十进制));
从小数范围中选择*
其中段='SEG1'
和date>='2015-01-01'和date=100和dec简短回答:在Cassandra中,没有办法对两个或多个集群列进行有效的范围查询
要理解这个限制的核心原因,您应该考虑卡桑德拉如何在单个分区中存储列的方式。
单个SSTable文件中分区内的所有行都根据它们的集群键进行排序,就像您的模式一样:
2015-01-01 100
2015-01-01 200
2015-01-01 300
2015-01-02 100
2015-01-02 200
2015-01-02 300
2015-01-03 100
有一种方法可以读取单个数据片(通过使用范围查询,如SELECT*FROM decimalrangeck,其中segment='SEG1'和date>='2015-01-01'和date是的,您可以通过使用和来完成
然后你可以使用类似的方法:
val conf = new SparkConf().setAppName(appName)
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val cc = new CassandraSQLContext(sc)
def getDays(startDate: String, endDate: String) : scala.Array[String] = {
var dates = scala.Array[String]()
var sDate = sdfDay.parseDateTime(startDate)
var eDate = sdfDay.parseDateTime(endDate)
var date = ""
while(sDate.isBefore(eDate.plusDays(1)) == true){
var sDay = sDate.getDayOfMonth()
var sMonth = sDate.getMonthOfYear()
var sYear = sDate.getYear()
date = "" + sYear + "-" + sMonth + "-" + sDay
println(date)
dates :+= date
sDate = sDate.plusDays(1)
}
dates //return
}
def preaperQuery(wereElement: String, andDateElement: String, andDecElement: String, tableName: String, days: scala.Array[String], decs: scala.Array[String]) : String = {
var q = "select * from " + tableName + "where " + wereElement + " and "
for (day <- days) {
q = q + andDateElement + " = '" + day + "' or "
}
for (dec <- decs) {
q = q + andDecElement + " = '" + dec + "' or "
}
//remove last " or " 4 chars
q = q.dropRight(4)
q //return
}
val days = Utils.getDays(startDate, endDate)
val decs = Array("100", "200", "300", "400") //or any function
var q = Utils.preaperQuery(wereElement="segment='SEG1'", andDateElement="date", andDecElement="ec", tableName="RangeSearch", days=days, decs=decs)
val selected_data = cc.sql(q).map(row => (row(0).toString, row(1).toString,row(2).toString,row(3).toString))
我有…看看这个cassandra插件:
2015-01-01 100
2015-01-01 200
2015-01-01 300
2015-01-02 100
2015-01-02 200
val conf = new SparkConf().setAppName(appName)
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val cc = new CassandraSQLContext(sc)
def getDays(startDate: String, endDate: String) : scala.Array[String] = {
var dates = scala.Array[String]()
var sDate = sdfDay.parseDateTime(startDate)
var eDate = sdfDay.parseDateTime(endDate)
var date = ""
while(sDate.isBefore(eDate.plusDays(1)) == true){
var sDay = sDate.getDayOfMonth()
var sMonth = sDate.getMonthOfYear()
var sYear = sDate.getYear()
date = "" + sYear + "-" + sMonth + "-" + sDay
println(date)
dates :+= date
sDate = sDate.plusDays(1)
}
dates //return
}
def preaperQuery(wereElement: String, andDateElement: String, andDecElement: String, tableName: String, days: scala.Array[String], decs: scala.Array[String]) : String = {
var q = "select * from " + tableName + "where " + wereElement + " and "
for (day <- days) {
q = q + andDateElement + " = '" + day + "' or "
}
for (dec <- decs) {
q = q + andDecElement + " = '" + dec + "' or "
}
//remove last " or " 4 chars
q = q.dropRight(4)
q //return
}
val days = Utils.getDays(startDate, endDate)
val decs = Array("100", "200", "300", "400") //or any function
var q = Utils.preaperQuery(wereElement="segment='SEG1'", andDateElement="date", andDecElement="ec", tableName="RangeSearch", days=days, decs=decs)
val selected_data = cc.sql(q).map(row => (row(0).toString, row(1).toString,row(2).toString,row(3).toString))
val data = selected_data.collect