使用Java Cassandra Spark SQL Connector按日期查询时遇到问题

时间:2015-03-16 15:39:50

标签: cassandra apache-spark datastax apache-spark-sql

我尝试使用Spark SQL按日期范围查询表。例如,我试图运行一个SQL语句,如:SELECT * FROM trip WHERE utc_startdate> =' 2015-01-01' AND utc_startdate< =' 2015-12-31' AND deployment_id = 1 AND device_id = 1.当我运行查询时,没有抛出任何错误,但是当我期待某些错误时,我没有收到任何结果。运行没有日期范围的查询时,我得到的结果。

SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("SparkTest")
    .set("spark.executor.memory", "1g")
    .set("spark.cassandra.connection.host", "localhost")
    .set("spark.cassandra.connection.native.port", "9042")
    .set("spark.cassandra.connection.rpc.port", "9160");
JavaSparkContext context = new JavaSparkContext(sparkConf);
JavaCassandraSQLContext sqlContext = new JavaCassandraSQLContext(context);
sqlContext.sqlContext().setKeyspace("mykeyspace");

String sql = "SELECT * FROM trip WHERE utc_startdate >= '2015-01-01' AND utc_startdate < '2015-12-31' AND deployment_id = 1 AND device_id = 1";
JavaSchemaRDD rdd = sqlContext.sql(sql);
List<Row> rows = rdd.collect(); // rows.size() is zero when I would expect it to contain numerous rows.

架构:

CREATE TABLE trip (
    device_id bigint,
    deployment_id bigint,
    utc_startdate timestamp,
    other columns....
    PRIMARY KEY ((device_id, deployment_id), utc_startdate)
) WITH CLUSTERING ORDER BY (utc_startdate ASC);

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的表架构(特别是您的PRIMARY KEY定义)是什么样的?即使没有看到它,我也相当确定您看到了这种行为,因为您没有使用分区键来限定查询。使用ALLOW FILTERING指令将按date过滤行(假设这是您的群集键),但这对于大型群集或大型数据集来说不是一个好的解决方案。

假设您正在查询特定地理区域的用户。如果您使用区域作为分区键,则可以运行此查询,它将起作用:

SELECT * FROM users
WHERE region='California'
AND date >= '2015-01-01' AND date <= '2015-12-31';

给Patrick McFadin撰写关于Getting Started with Timeseries Data的文章。这有一些很好的例子可以帮助你。