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



我正在尝试使用Spark SQL按日期范围查询表。例如,我正在尝试运行如下 SQL 语句:选择 * FROM 行程,其中 utc_startdate>= '2015-01-01' 和 utc_startdate <= '2015-12-31' 和 deployment_id = 1 和 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);

任何帮助将不胜感激。

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

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

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

阅读 Patrick McFadin关于时间序列数据入门的文章。 这有一些很好的例子应该对你有所帮助。

相关内容

  • 没有找到相关文章

最新更新