Spark Cassandra连接器 - where子句

4

我正在尝试使用Datastax发布的新连接器,通过Spark对Cassandra中存储的时间序列数据进行分析。

在我的模式中,分区键是计量器ID,我希望只对特定系列运行Spark操作,因此需要按计量器ID进行过滤。

然后我想运行这样的查询:Select * from timeseries where 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

我的分区键自动添加了一个子句(token("series_id") > X AND token("series_id") <=Y),然后我的内容被附加在其后。很明显这样是行不通的,我会收到一个错误信息:"如果包含相等关系,则 series_id 不能被限制超过一个关系"。
有没有办法摆脱自动添加的子句?我有什么遗漏的地方吗?
提前感谢您的回答。
1个回答

4
驱动程序会自动使用从集群中获取的表元数据确定分区键。然后,它将使用这个键将标记范围追加到您的CQL中,以便可以从特定节点读取一块数据。换句话说,Cassandra认为series_id是您的分区键而不是meter_id。如果您在表上运行描述命令,我敢打赌您会感到惊讶。

请问您能否发布您的模式? - rs_atl
我在您的架构中没有看到meter_id;series_id是您的分区键。问题是通过分区键进行查询在Spark中效率会非常低,因为所有请求都将发送到同一节点。实际上,您的架构本身看起来很可疑,因为给定系列的所有事件都将发送到同一节点(及其副本)。这不太可能导致均匀分布。 - rs_atl
如果series_id实际上是一个特定的计量器(我曾经处理过公用事业计量器数据,所以我假设类似的情况),那么听起来你的Spark作业只是在分析单个计量器。如果这不是很多数据,那么1)为什么要使用Spark,2)为什么不直接获取所有计量器并一次性处理所有数据呢? - rs_atl
太好了。如果这个回答有帮助,您可以接受/点赞它吗? - rs_atl
另外,如果您只想要一定时间范围内的数据,您可以在“ts”上添加过滤器。这可能是您正在寻找的内容。 - rs_atl
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接