我尝试使用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);
非常感谢任何帮助。
答案 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的文章。这有一些很好的例子可以帮助你。