Spark Cassandra 连接器 - where 子句

Posted

技术标签:

【中文标题】Spark Cassandra 连接器 - where 子句【英文标题】:Spark Cassandra connector - where clause 【发布时间】:2014-07-28 11:34:30 【问题描述】:

我正在尝试使用 spark 和 Datastax 发布的新连接器对存储在 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")

有没有办法摆脱自动添加的子句?我错过了什么吗?

提前致谢

【问题讨论】:

【参考方案1】:

驱动程序使用从集群本身获取的表元数据自动确定分区键。然后它使用它来将令牌范围附加到您的 CQL,以便它可以从它尝试查询的特定节点读取大量数据。换句话说,Cassandra 认为 series_id 是您的分区键,而不是meter_id。如果你在你的桌子上运行一个 describe 命令,我敢打赌你会感到惊讶。

【讨论】:

感谢您的回复。 “series_id”实际上是分区键(我知道),它也是仪表 ID。我只想按分区键过滤。换句话说,我需要 SELECT * FROM timeseries where series_id = X。这不可能吗? 您能发布您的架构吗? CREATE TABLE timeseries (series_id bigint, ts timestamp, value double, PRIMARY KEY (series_id, ts) ) 我在你的架构中看不到meter_id; series_id 是您的分区键。问题是在 Spark 中按分区键查询效率很低,因为您的所有请求都将发送到同一个节点。实际上,您的架构本身看起来很可疑,因为给定系列的所有事件都将转到同一个节点(及其副本)。这不太可能导致均匀分布。 在架构中,我将仪表 ID 称为“series_id”。这个模式对我有用,因为我有很多不是太大的系列(它是 5 或 6 年的每小时数据)。我只需要在其中一些上运行一些聚合,我正在考虑用 Spark 来做。感谢您的帮助

以上是关于Spark Cassandra 连接器 - where 子句的主要内容,如果未能解决你的问题,请参考以下文章

如何用Cassandra连接火花

Spark Cassandra 连接器找不到 java.time.LocalDate

Spark Cassandra 连接器 - perPartitionLimit

Spark Cassandra 连接器 - where 子句

RDD 不可序列化 Cassandra/Spark 连接器 java API

Spark Cassandra 连接器:SQLContext.read + SQLContext.write 与手动解析和插入(JSON -> Cassandra)