民间,
我目前已经开始阅读有关NOSQL相关数据库的文章,目前正致力于数据仓库相关应用程序。
我有以下问题。我已经阅读了基础知识。
问题1)如果将具有相同列的数据存储在一起,如何在面向列的数据库中重新检索整个原始数据?
假设我们以下列格式存储数据,因此在内部它将像这样存储在面向列的数据库中。
一起测试| test1和5 | 10一起。
键1:{name:test,value:5} 键2:{name:test1,value:10}
因此,如果我们必须检索key1的数据,它是如何发生的? (A和B是我的猜测)
A)如果必须单独从每个列存储中选择数据,那么它将非常昂贵
B)是否有任何索引机制来获取给定原始密钥的所有列的数据?
问题2)
我正在阅读一些文档,发现面向列的数据库更适合在单列上运行聚合函数,因为I / O会更少。
我没有在像Cassandra和HBASE这样的NOSQL列导向存储中找到对SUM,AVG等聚合函数的适当支持。 (可能会有一些调整/黑客/更多代码编写如下)
How does Apache Cassandra do aggregate operations? realtime querying/aggregating millions of records - hadoop? hbase? cassandra? How to use hbase coprocessor to implement groupby?
问题3)在面向列的数据库内部如何进行连接是否可取?
答案 0 :(得分:0)
好问题, 1)在Cassandra中,如果你使用的是cqlsh,那么它看起来就像你在mysql或其他一些rdbms商店中存储数据一样。
Connected to Test Cluster at localhost:9160.
[cqlsh 3.1.7 | Cassandra 1.2.9 | CQL spec 3.0.0 | Thrift protocol 19.36.0]
Use HELP for help.
cqlsh> create keyspace test with replication={'class':'SimpleStrategy', 'replication_factor': 1
<value>
cqlsh> create keyspace test with replication={'class':'SimpleStrategy', replication_factor': 1};
cqlsh> USE test ;
cqlsh:test> create table entry(key text PRIMARY KEY, name text, value int );
cqlsh:test> INSERT INTO entry (key, name , value ) VALUES ( 'key1', 'test',5);
cqlsh:test> INSERT INTO entry (key, name , value ) VALUES ( 'key2', 'test1',10);
cqlsh:test> select * from entry;
key | name | value
------+-------+-------
key1 | test | 5
key2 | test1 | 10
cqlsh:试验&gt;
注意: - 您可以使用键选择行,或使用二级索引在其他列上使用某些条件。
但是在hbase中,结构将如下所示
rowkey | column family | column | value
key1 | entry | name | test
key1 | entry | value | 5
key2 | entry | name | test1
key2 | entry | value | 10
注意: - 您可以使用键或任何列值选择每一行非常容易。
2)是的,nosqls也支持DML的批量操作。
3)nosqls数据存储区中不支持联接。它们不适用于连接。
希望它会对你有所帮助。