gpt4 book ai didi

cassandra - 了解 Cassandra 的存储开销

转载 作者:行者123 更新时间:2023-12-04 14:12:56 31 4
gpt4 key购买 nike

我一直在阅读this section Cassandra 文档,发现以下有点令人费解:

Determine column overhead:

regular_total_column_size = column_name_size + column_value_size + 15

counter - expiring_total_column_size = column_name_size + column_value_size + 23

Every column in Cassandra incurs 15 bytes of overhead. Since each row in a table can have different column names as well as differing numbers of columns, metadata is stored for each column. For counter columns and expiring columns, you should add an additional 8 bytes (23 bytes total).


我为 CQL3 定义的模式解释上述内容的方式,例如:
CREATE TABLE mykeyspace.mytable(
id text,
report_id text,
subset_id text,
report_date timestamp,
start_date timestamp,
end_date timestamp,
subset_descr text,
x int,
y double,
z int,
PRIMARY KEY (id, report_id, subset_id)
);
是每一行都将包含列名称的元数据,例如,字符串 report_date , start_date , end_date等及其类型以及数据。但是,我不清楚表中的每一行都可以有不同的列名是什么意思。鉴于上面的架构完全是 ,这对我来说听起来是错误的。静态 ,即,如果我尝试编写,Cassandra 2.0 肯定会提示:
INSERT INTO mykeyspace.mytable (id, report_id , subset_id, x, y, z, w) 
VALUES ( 'asd','qwe','rty',100,1.234,12, 123.123);

Bad Request: Unknown identifier w
现在在我看来,列名在给定这个表架构的情况下是固定的,因此不需要每行存储元数据。我猜要么文档中的措辞已经过时(与 Ca​​ssandra 1.2 相同),要么我误解了这里工作的一些核心概念。
有人可以澄清吗?底线:我是否必须担心我的列名称的长度?
我们一直在谨慎行事,并在可能的情况下使用单字符名称(因此上面的列实际上是 irsdrdsde5| ..),但它是如此非人类无法阅读,并且可能会令人困惑。

最佳答案

弄清楚在这种情况下发生了什么的最简单方法是检查数据的 sstable2json (cassandra/bin) 表示。这将显示最终实际保存在磁盘上的内容。

这是您的情况的示例

 [
{"key": "4b6579","columns": [
["rid1:ssid1:","",1401469033325000],
["rid1:ssid1:end_date","2004-10-03 00:00:00-0700",1401469033325000],
["rid1:ssid1:report_date","2004-10-03 00:00:00-0700",1401469033325000],
["rid1:ssid1:start_date","2004-10-03 00:00:00-0700",1401469033325000],
["rid1:ssid1:subset_descr","descr",1401469033325000],
["rid1:ssid1:x","1",1401469033325000],
["rid1:ssid1:y","5.5",1401469033325000],
["rid1:ssid1:z","1",1401469033325000],
["rid2:ssid2:","",1401469938599000],
["rid2:ssid2:end_date", "2004-10-03 00:00:00-0700",1401469938599000],
["rid2:ssid2:report_date","2004-10-03 00:00:00-0700",1401469938599000],
["rid2:ssid2:start_date","2004-10-03 00:00:00-0700",1401469938599000],
["rid2:ssid2:subset_descr","descr",1401469938599000],
["rid2:ssid2:x","1",1401469938599000],
["rid2:ssid2:y","5.5",1401469938599000],
["rid2:ssid2:z","1",1401469938599000]
}
]

正如您在上面看到的那样,每个分区(每个 sstable)保存一次分区键的值,在这种情况下,列名根本无关紧要,因为它是隐式给定的表。聚类列的列名也不存在,因为使用 C* 你不能在没有指定键的所有部分的情况下插入。

剩下的虽然确实有列名,但如果对行进行部分更新,则需要这样做,以便可以在没有其余行信息的情况下保存它。您可以想象对一行中的单个列字段进行更新,以指示这是 C* 的哪个字段当前使用列名,但有票可以将其更改为较小的表示形式。
https://issues.apache.org/jira/browse/CASSANDRA-4175

要生成这个
cqlsh
CREATE TABLE mykeyspace.mytable( id text, report_id text, subset_id text, report_date timestamp, start_date timestamp, end_date timestamp, subset_descr text, x int, y double, z int, PRIMARY KEY (id, report_id, subset_id) );
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid1','ssid1', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
INSERT INTO mykeyspace.mytable (id, report_id , subset_id , report_date , start_date , end_date , subset_descr ,x, y, z) VALUES ( 'Key', 'rid2','ssid2', '2004-10-03','2004-10-03','2004-10-03','descr',1,5.5,1);
exit;
nodetool flush
bin/sstable2json $DATA_DIR/mytable/mykeyspace-mytable-jb-1-Data.db

关于cassandra - 了解 Cassandra 的存储开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958432/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com