![](/img/trans.png)
[英]Access multi-dimensional WrappedArray elements in Java using Spark SQL Row
[英]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的方式对其进行建模,而我面前有以下几种方法。
将维度添加为新列,并使用map
作为数据类型。 如果您发现我的结果之一item_code = {item sold =3, Unique_item_sold (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';
汇总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.