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) 时,我们如何避免丢失写入?

CAS中客户端怎么获取Server端的session信息

com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cas

集中认证服务CAS vs 单点登录SSO

cas单点登录怎么在服务器端获得用户信息

cassandra中的分区计数