我正在尝试使用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关于时间序列数据入门的文章。 这有一些很好的例子应该对你有所帮助。