cassandra 中的不同用户,该怎么做?
Posted
技术标签:
【中文标题】cassandra 中的不同用户,该怎么做?【英文标题】:Distinct user in cassandra , how to do that? 【发布时间】:2016-11-29 08:52:48 【问题描述】:我在 scala 中开发一个大数据应用程序。
我使用 kafka、spark(带有 kafka 流)和 Cassandra 作为存储。
我在 spark 之外有一个应用程序,它要求 Cassandra 显示下载次数等统计结果。
我对用户统计有疑问。
我需要按 publisher_id 或 publisher_id + app_id 甚至所有 publisher_id 计算一个时期内(可能是 1 天、6 天、7 天、一个月或其他任何时间)的唯一用户数。
我需要计入live,因为我不知道用户选择的时间段是多少。
我的会话用户的原始数据是:
CREATE TABLE tests2.raw_sessions (
date_event timeuuid,
year int,
month int,
day int,
hour int,
publisher_id uuid,
app_id text,
user_id text,
session_id text,
PRIMARY KEY (date_event, year, month, day, hour, publisher_id, app_id,
user_id, session_id)
) WITH CLUSTERING ORDER BY (year DESC, month DESC, day DESC, hour DESC, publisher_id ASC, app_id ASC, user_id ASC, session_id ASC)
我创建了多个表并在 cassandra 中尝试了很多东西。我尝试在 cassandra 中使用 distinct 关键字,但它仅用于静态列(但它不是静态列),它可以是表中的唯一分区键(我需要过滤日期,以及发布者 id、app_id
我曾考虑过使用 Postgres 数据库,但使用 kafka 流式传输,这并不是最理想的,不是吗?
我应该使用什么解决方案?
【问题讨论】:
我不太明白你的问题。您要查询 Cassandra 还是 Spark? 我想查询 Cassandra。并通过 publisher_id 过滤器获取一段时间内的 Uniq 用户列表。我不知道如何用 Cassandra 做到这一点 【参考方案1】:使用 cassandra 数据建模,数据复制非常有用。 Cassandra 是写密集型数据库。写入非常便宜。在对数据进行建模时,始终考虑单个查询。
Uniq users list for a period by publisher_id
如果您看到,您需要三个查询。
1. Unique users by publisher id for a perieod of day.
2. Unique users by publisher id for a perieod of month.
3. Unique users by publisher id for a perieod of year.
更好的方法是创建三个不同的表
CREATE TABLE users_by_year(
year int,
month int,
day int,
hour int,
publisher_id uuid,
app_id text,
user_id text,
session_id text,
PRIMARY KEY ((year,publisher_id),user_id )
)WITH CLUSTERING ORDER BY(user_id DESC)
CREATE TABLE users_by_month(
year int,
month int,
day int,
hour int,
timestamp int,
publisher_id uuid,
app_id text,
user_id text,
session_id text,
PRIMARY KEY ((month ,publisher_id),user_id)
)WITH CLUSTERING ORDER BY( user_id DESC);
CREATE TABLE users_by_day(
year int,
month int,
day int,
hour int,
timestamp int,
publisher_id uuid,
app_id text,
user_id text,
session_id text,
PRIMARY KEY ((day,publisher_id),user_id)
)WITH CLUSTERING ORDER BY( user_id DESC);
Thease 模型将为发布者 ID 保留年、月、日的唯一用途。
Uniq users filetr by publisher_id
CREATE TABLE users_by_publisherid(
year int,
month int,
day int,
hour int,
timestamp int,
publisher_id uuid,
app_id text,
user_id text,
session_id text,
PRIMARY KEY (publisher_id,user_id)
)WITH CLUSTERING ORDER BY( user_id DESC);
此表将保留 publisher_id 的唯一用户。
【讨论】:
感谢您的回答 Gunwant。但是我认为确实是不正确的,对于user_by_day,如果1月1日有用户来,将写入一行,那么如果2月1日,同一用户再次来,它将重写该行不是是吗?【参考方案2】:要求您绝对必须拥有超准确的计数数据。如果不使用 HyperLogLog 之类的估计数据结构,会有很大帮助。
【讨论】:
以上是关于cassandra 中的不同用户,该怎么做?的主要内容,如果未能解决你的问题,请参考以下文章
在 Cassandra 中使用轻量级事务 (CAS) 时,我们如何避免丢失写入?
com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cas