繁体   English   中英

Cassandra多维数据模型

[英]Cassandra multi-dimensional datamodel

我是Cassandra数据建模的新手,我有一个场景,如果可能的话,我需要在单个行中容纳多维数据(是的,我知道Cassandra是列式存储)。我的示例数据集(试图简化我的用例,请耐心等待)与我的格式)

时间戳记,transaction_id,item_code,user_id,付款方式

20130304221518,abcd,3,6,信用卡

20130304221519,EFGH,4,5,Cashondelivery

20130305180402,ijkl,4,5,Cashondelivery

例如, payment_mode,user_id,item_code是我的尺寸,我想用给定的维度聚合数据集。我的简单聚合结果是

payment_method = {cashondelivery = 2, credit card = 1)
Transaction_by_unique_user_id ={5 =2,6=1}
item_code = {item sold =3, Unique_item_sold (4 =2 ,3=1) }

请注意,在不久的将来,我可能需要添加一些维度,并且数据模型也应该容纳这些维度。我想以Cassandra的方式对其进行建模,而我面前有以下几种方法。

  1. 每个维度的新表格。
  2. 将维度添加为新列,并使用map作为数据类型。 如果您发现我的结果之一item_code = {item sold =3, Unique_item_sold (4 =2 ,3=1) } ,则这种结果无法以map数据类型和维作为列名来容纳。

  3. 将每个维度值作为新行插入到单个表中。

另请注意,我会经常读取数据。因此,读取不应影响数据模型的性能。 *我的汇总将每1个小时的数据发生一次,因此我使用Spark进行分析。*请向我建议正确的方法。

我认为,您必须定期插入大量数据。 因此,我们必须仔细选择分区键,以免将大量数据插入单个分区中。 尽管您每小时都在汇总结果,但我选择分区作为每小时间隔。

这是主表模式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM