Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Select Cassandra-如何在2个关键列中按范围搜索?_Select_Cassandra_Cql - Fatal编程技术网

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