我们大量使用Cassandra宽行来存储时间序列,因为它们非常适合用例。
create table user_events (
user_id text,
timestmp timestamp,
event text,
primary key((user_id), timestmp));
假设我想使用spark进行以下聚合:选择上个月至少有1个事件的所有user_ids。
最有效的方法是什么?
答案 0 :(得分:0)
由于您将user_id作为主键,因此查询时需要知道用户ID是什么。但是从你的问题描述中,它是另一种方式。
您的表格如下:
create table user_events (
start timestamp,
eventtime timestamp,
user_id text,
event text,
primary key (start, eventtime, userid)
);
您可以根据每秒的事件按天或按周对传入事件进行分区 - 这样就不会超过Cassandra的宽行限制。
然后在Spark中,您可以使用:
进行查询sc.cassandraTable(keyspace, table)
.select("user_id")
.where("start = ?", <a set of partitions>)
.where("eventtime > ?", <one month before timestamp>)