当前位置: 首页 > 知识库问答 >
问题:

Cassandra多维数据模型

冯鸿光
2023-03-14

我是Cassandra数据建模的新手,如果可能的话,我需要在单行中容纳多维数据(是的,我知道Cassandra是柱状存储)。我的示例数据集(试图简化我的用例,忍受我的格式化)

时间戳、交易id、项目代码、用户id、支付方式

20130304221518,abcd,3,6,信用卡

20130304221519,efgh,4,5,现金配送

20130305180402,ijkl,4,5,现金交付

例如,<code>payment_mode、user_id、item_code</code>是我的维度,我想用给定的维度聚合数据集。我的简单汇总结果是

payment_method = {cashondelivery = 2, credit card = 1)
Transacthtml" target="_blank">ion_by_unique_user_id ={5 =2,6=1}
item_code = {item sold =3, Unique_item_sold (4 =2 ,3=1) }

请注意,在不久的将来,我可能需要添加更多的维度,数据模型也应该能够容纳这些维度。我想以卡珊德拉的方式建模,我面前有以下方法。

> < li >每个维度的新表格。 < li>

添加维度作为新列,并使用< code>map作为数据类型。如果您注意到我的一个结果< code>item_code = {item sold =3,Unique_item_sold (4 =2,3=1) },这种结果不能与< code>map数据类型和作为列名的维相适应。

将每个尺寸值作为新行插入单个表格中。

还要注意,我会经常阅读数据。因此,读取不应该对我的数据模型造成性能影响*我的数据聚合将每1小时进行一次,我使用Spark进行分析*。请建议我正确的方法。非常感谢您的建议。

共有1个答案

司徒兴德
2023-03-14

我想,你必须定期插入大量数据。因此,我们必须仔细选择分区键,以便不会将大量数据插入单个分区。虽然您每小时聚合一次结果,但我选择分区作为每小时的间隔。

下面是主表模式:

CREATE TABLE transaction (
    hour int,
    day int,
    month int,
    year int,
    transaction_id text,
    item_code bigint,
    payment_method text,
    user_id bigint,
    PRIMARY KEY ((hour, day, month, year), transaction_id)
); 

在这里,您可以将时间戳字段分为小时日月和年。

如果你想汇总结果,你应该使用Spark或Hadoop,这是这类工作的最佳选择。

或者

如果你想在cassandra中做这种工作,你必须为每个维度使用单独的表。当你在主表上插入数据时,也必须在每个表上插入数据。

合计付款_方式:

CREATE TABLE payment_method_counter (
    hour int,
    day int,
    month int,
    year int,
    type text,
    count counter,
    PRIMARY KEY ((hour, day, month, year), type)
);

您可以使用以下查询插入数据:

UPDATE payment_method_counter SET count = count + 1 WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017 AND type = 'cashondelivery';

聚合Transaction_by_unique_user_id :

CREATE TABLE user_transaction_counter (
    hour int,
    day int,
    month int,
    year int,
    userid bigint,
    count counter,
    PRIMARY KEY ((hour, day, month, year), userid)
);

并插入查询:

UPDATE user_transaction_counter SET count = count + 1 WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017 AND userid = 5;

已售出商品合计:

CREATE TABLE item_sold_counter (
    hour int,
    day int,
    month int,
    year int,
    item_code bigint,
    count counter,
    PRIMARY KEY ((hour, day, month, year), item_code)
);

您可以查询:

UPDATE item_sold_counter SET count = count + 1 WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017 AND item_code = 4;

在这里,对于出售的总商品,使用一个特殊的值,如item_code=0。对于每个出售的商品,也插入一个带有的值item_code=0

获取结果:

您可以获得一个小时的聚合结果,如下所示:

cassandra@cqlsh:test> SELECT * FROM payment_method_counter  WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017;

 hour | day | month | year | type           | count
------+-----+-------+------+----------------+-------
    1 |   1 |     1 | 2017 | cashondelivery |     2
    1 |   1 |     1 | 2017 |     creditcard |     1

(2 rows)
cassandra@cqlsh:test> SELECT * FROM user_transaction_counter WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017;

 hour | day | month | year | userid | count
------+-----+-------+------+--------+-------
    1 |   1 |     1 | 2017 |      5 |     2
    1 |   1 |     1 | 2017 |      6 |     1

(2 rows)
cassandra@cqlsh:test> SELECT * FROM item_sold_counter  WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017;

 hour | day | month | year | item_code | count
------+-----+-------+------+-----------+-------
    1 |   1 |     1 | 2017 |         0 |     3
    1 |   1 |     1 | 2017 |         3 |     1
    1 |   1 |     1 | 2017 |         4 |     2
 类似资料:
  • 主要内容:群集,键空间,Cassandra数据模型规则,数据建模目标Cassandra中的数据模型与RDBMS中正常情况完全不同。 我们来看看Cassandra如何存储数据。 群集 Cassandra数据库分布在运行的几(多)台机器上。 最外层的容器被称为包含不同节点的群集。 每个节点都包含一个副本,如果发生故障,副本将负责顶上。 Cassandra将节点以环形格式排列在群集中,并为其分配数据。 键空间 键空间(Keyspace)是Cassandra中数据的最外层

  • 请针对以下需求对Cassandra表的数据模型给出一些建议/想法。我不确定这是否可以实现。如果可以实现,我们就不需要编写外部程序了 注意:这有助于连接两个Kafka主题和任何更新发生在任何一个Kafka,两者将反映在非ormalized格式在卡桑德拉表 根据我们的要求,任何一个主键的值是相同的,应该向上。未插入。

  • 表1: 表1的键和数据大小: 我的分区密钥为enterprise_id+campaign_id。每个企业可以有几个活动。datastore可能有几百个活动的数据。每个活动可以有多达200万-300万的记录。因此,在100个企业中可能有3000个分区,每个分区有2-3个miilion记录。 Cassandra查询:查询始终使用分区键+主键直到日期时间。订阅id包含在主键中,以保持每个记录的唯一性,因

  • 本文向大家介绍多维数据库,包括了多维数据库的使用技巧和注意事项,需要的朋友参考一下 多维数据库主要用于OLAP(在线分析处理)和数据仓库。它们可用于向用户显示多维数据。 多维数据库是从多个关系数据库创建的。关系数据库允许用户以查询形式访问数据,而多维数据库则允许用户提出与业务或市场趋势有关的分析性问题。 多维数据库使用MOLAP(多维在线分析处理)来访问其数据。它们允许用户通过相当快地生成和分析数

  • 我目前有一个应用程序,它将事件驱动的实时流数据持久化到一个列系列,该系列建模为: 每个帐户ID每X秒发送一次数据,因此我们每次收到事件时都会覆盖现有行。此数据包含当前实时信息,我们只关心最近的事件(不使用旧数据,这就是我们插入已经存在的键的原因)。从应用程序用户端-我们通过account_id语句查询选择。 我想知道是否有更好的方法来模拟这种行为,并查看了Cassandra的最佳实践和类似的问题(

  • 我有一个 Cassandra 它有 4 列(项目(文本),市场(文本项目是分区键和市场,位置和时间是相同顺序的聚类键。 应用程序需要在两种情况下查询 Cassandra 表 对于给定的项目,市场和位置通过查询库存表来获取记录。例如,将获取记录下面的项目x、市场l1和位置l1 对于给定的商品、市场和输入时间后的所有位置,通过查询库存表获取记录。例如,项目x,市场m1,将获取t1时间之后低于记录的所有