2013-08-01 54 views
0

我想要有一個列族,我可以讓一個CQL的密鑰獲得一個基於一個密鑰和另一個CQL的行,我有一個使用「 IN「關鍵字並具有ORDER BY子句。我得到的數據來自列值而不是列名。我遇到的問題是試圖設置列家族來實現這一點。我有這個cli命令來創建列族,但是當我去做一個插入時,我得到一個關於主鍵的奇怪異常。以下是創建列族後插入列值時的cli和錯誤。使用CompositeType從客戶端獲取插入錯誤

用於創建列族CLI命令:

create column family video_item_details 
with key_validation_class = 'CompositeType(IntegerType,UTF8Type)' 
and comparator = 'UTF8Type' 
and column_metadata = [ 
{column_name : key, validation_class: IntegerType, index_type: KEYS} 
{column_name : name, validation_class : 'UTF8Type', index_type: KEYS} 
{column_name : description, validation_class :'UTF8Type'} 
{column_name : url, validation_class : 'UTF8Type'} 
{column_name : play_time, validation_class : 'UTF8Type'} 
{column_name : type, validation_class : 'UTF8Type'} 
] 
with caching='ALL'; 

插入過程中的錯誤是:

錯誤,同時插入com.datastax.driver.core.exceptions.InvalidQueryException:缺少強制PRIMARY KEY部分KEY2

,目前正在試圖執行的INSERT語句是:

INSERT INTO video.video_item_details(key, name, description, url, play_time, type) values 
(1,'Gettysburg','Gettysburg Movie Trailer','test','2:53','Streaming') 

感謝您提供有關如何讓Cassandra執行此類查詢的任何建議。你似乎

最好的問候, 託尼

回答

3

DataStax Java driver要支持使用 CQL3對我它看起來像您已使用節儉API定義的表。結合2將引導你進入這樣的問題。

我已在此另一個SO question上發佈了一組鏈接,其中涵蓋了2個接口之間的區別。

+0

謝謝,但卡桑德拉團隊使用CompositeType告訴我這是做到這一點的方法。當我使用CQL創建列族時,我在做關於未知類型的插入時出現錯誤,Cassandra團隊表示使用CQL創建列族不會保留CQL語句中指定的順序,這讓我感到驚訝,所以我訴諸於更好的控制。因此,考慮到這一點,什麼是正確的方式來完成這個插入工作如預期,還有ORDER BY? –

+0

忘了提及我沒有使用DataStax驅動程序來創建我正在使用cli的表。我在插入時使用CQL。 –

+0

我希望cli或存儲引擎級命令的能力可以在CQL級別上使用,因爲DBA和技術潛在客戶喜歡對錶創建進行精細的級別控制。這是我真正想說的。 –

0

該消息表示您錯過了「key2」列(CompositeType的第二部分)。

但是就像Alex告訴你的,正確的做法是從CQL創建表[即使用cqlsh],而不是嘗試手動對CompositeTypes進行修改。 「卡桑德拉團隊」中的任何人都會告訴你同樣的事情。來源:我是Apache Cassandra項目主席和DataStax Cassandra團隊負責人。

+0

不要緊,我得到它的工作感謝您的幫助。在我發佈的示例中沒有key2,所以錯誤消息沒有用。 –

+0

謝謝我終於做好了一切工作,包括順序。關於創建表的CQL3,它似乎並不支持所有的cli示例。有許多表創建的cli示例似乎表明對CQL 3示例似乎沒有的表創建的更多控制。我相信在stackoverflow甚至有關於cql和cli的問題。 –

+0

CQL支持所有cli定義;只需從cqlsh中選擇或描述表格,看看它是如何理解的。至於使用哪個,這很簡單:cqlsh。 cli只是爲了向後兼容而存在。 – jbellis