2013-06-22 92 views
21

我是cassandra的新手。在这里,我有两个表EVENTSTOWER。我需要加入这些查询。但我无法做到这一点。如何在cassandra中使用2个或多个表进行连接查询cql

eid int PRIMARY KEY, 
a_end_tow_id text, 
a_home_circle text, 
a_home_operator text, 
a_imei text, 
a_imsi text, 

结构TOWER表:

tid int PRIMARY KEY, 
tower_address_1 text, 
tower_address_2 text, 
tower_azimuth text, 
tower_cgi text, 
tower_circle text, 
tower_id_no text, 
tower_lat_d text, 
tower_long_d text, 
tower_name text, 

现在,我想就加入这些表EIDTID,这样我可以获取的数据

结构EVENTS表两个表。

+0

的[内蒙古加盟卡桑德拉CQL(https://stackoverflow.com/questions/16790297/inner-join-in-cassandra-cql) – Raedwald

回答

52

Cassandra = No Joins。你的模型是100%关系。你需要重新考虑Cassandra。我建议你看看these slides。他们深入研究如何为cassandra建模。另外这里是涵盖该主题的webinar。但停止考虑外键和连接表,因为如果你需要关系cassandra不是工作的工具。

但是为什么?
因为那么您需要检查一致性并执行关系数据库所做的其他许多事情,因此您将失去cassandra提供的性能和可伸缩性。

我该怎么办?
DENORMALIZE!一张桌子上有很多数据?但是桌子会有太多列!
那么? Cassandra可以处理表格中的大量列。

您可以做的另一件事是模拟客户端应用程序中的连接。匹配代码中的两个数据集,但这会非常缓慢,因为您必须遍历所有信息。

另一种方法是进行多个查询。选择你想要的事件,然后选择匹配的塔。

+0

是没关系redundunt数据存储在我的卡桑德拉表可能的复制?例如,我有一个user_detail表和一个评论表。这两个表都有一个公共列user_id。什么是更好的做事方式。我应该在我的评论表中存储多余的数据,以便我不需要查询其他表? –

+0

'另一种方法是执行多个查询。选择你想要的事件,然后选择匹配的塔。'这是否意味着做两个SELECT查询,例如从table1中选择id,然后执行SELCT col1,col2 FROM table2其中col3 = ?这是根据卡桑德拉的数据模型吗? – manish

0

PlayOrm是使用特殊的可扩展SQL语言在可伸缩系统上进行连接的好选择,您可以在其中连接分区(即,您不希望再连接10亿行的10亿行)。它有大量的noSQL模式,并且是休眠和JPA的彻底突破,以便在需要时通过客户端连接模拟noSQL模式。

5

有几种方法可以将表连接在Cassandra中并查询它们。但是,当然你必须重新考虑数据模型部分。

  1. 使用Apache Spark’s SparkSQL™与Cassandra(无论是开源还是在DataStax Enterprise - DSE中)。
  2. 使用DataStax provided ODBC连接器与Cassandra和DSE。
相关问题