我正在尝试使用spark和Datastax发布的新连接器对存储在cassandra中的时间序列数据进行一些分析。
在我的架构中,分区键是仪表ID,我想仅在特定系列上运行spark操作,因此我需要按米ID进行过滤。
然后我想运行一个查询:从timeseries中选择*,其中series_id = X
我试图通过以下方式实现这一目标:
JavaRDD<CassandraRow> rdd = sc.cassandraTable("test", "timeseries").select(columns).where("series_id = ?",ids).toJavaRDD();
执行此代码时,生成的查询为:
SELECT "series_id", "timestamp", "value" FROM "timeseries" WHERE token("series_id") > 1059678427073559546 AND token("series_id") <= 1337476147328479245 AND series_id = ? ALLOW FILTERING
在我的分区键上自动添加一个子句(令牌(&#34; series_id&#34;)&gt; X AND令牌(&#34; series_id&#34;)&lt; = Y)然后追加我的那。这显然不起作用,我得到一个错误说:&#34;如果系列包含等于&#34;则不能被多个关系限制。
有没有办法摆脱自动添加的条款?我错过了什么吗?
提前致谢
答案 0 :(得分:4)
驱动程序使用从群集本身获取的表元数据自动确定分区键。然后,它使用它将令牌范围附加到您的CQL,以便它可以从它尝试查询的特定节点读取一大块数据。换句话说,Cassandra认为series_id是你的分区键,而不是meter_id。如果你在桌子上运行一个describe命令,我敢打赌你会感到惊讶。