Apache spark 卡桑德拉多维数据模型

Apache spark 卡桑德拉多维数据模型,apache-spark,cassandra,cql,Apache Spark,Cassandra,Cql,我不熟悉Cassandra数据建模,我有一个场景,如果可能的话,我需要在一行中容纳多维数据。我知道Cassandra是柱状存储。我的示例数据集试图简化我的用例,但我的格式化需要耐心 时间戳、交易id、项目代码、用户id、付款方式 20130304221518,abcd,3,6,信用卡 20130304221519,efgh,4,5,现金交付 20130305180402,ijkl,4,5,现金交付 例如,付款方式、用户id、项目代码是我的维度,我想用给定维度聚合数据集 payment_metho

我不熟悉Cassandra数据建模,我有一个场景,如果可能的话,我需要在一行中容纳多维数据。我知道Cassandra是柱状存储。我的示例数据集试图简化我的用例,但我的格式化需要耐心

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

20130304221518,abcd,3,6,信用卡

20130304221519,efgh,4,5,现金交付

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

例如,付款方式、用户id、项目代码是我的维度,我想用给定维度聚合数据集

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) }
请注意,在不久的将来,我可能需要添加更多维度,数据模型也应该适应这些维度

每个维度的新表。 将标注添加为新列,并将地图用作数据类型。 如果您注意到我的结果项_code={item sell=3,Unique_item_sell 4=2,3=1}中的一个,则这种结果不能以map数据类型和维度作为列名

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


还要注意的是,我会经常读取数据,所以读取数据不应该影响我的数据模型的性能*我的聚合将发生每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';
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
按唯一用户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;
此处,对于已售出的商品总额,请使用一个特殊值,如商品代码=0。对于售出的每件商品,也插入一个商品代码为0的值

获得结果:

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

UPDATE payment_method_counter SET count = count + 1 WHERE hour = 1 AND day = 1 AND month = 1 AND year = 2017 AND type = 'cashondelivery';
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

是否要聚合所有数据或特定的日期、月份或年份?基本上,聚合将按分钟到小时进行。您的聚合结果是否仅为count cashondelivery=2或事务id列表?基本上是的……感谢您花时间和对场景的研究。我会尝试一下,然后再回复你。你建议在这里为每个维度设置不同的表吗?是的,我的数据量很大,我使用sparkprocessing@BalajiReddyspark最适合您的用例。@Ashraful Islam yes