我想在Cassandra 1.2.8中插入一列有50,000列的行。之前插入,我都爲整個行的數據準備好(在內存中):使用Cassandra和CQL3,如何在單個請求中插入整個寬行?
+---------+------+------+------+------+-------+
| | 0 | 1 | 2 | ... | 49999 |
| row_id +------+------+------+------+-------+
| | text | text | text | ... | text |
+---------+------+------+------|------+-------+
列名是整數,允許分頁切片。 列值是該特定索引處的值。
CQL3表定義:
create table results (
row_id text,
index int,
value text,
primary key (row_id, index)
)
with compact storage;
正如我已經有ROW_ID和內存50,000名名稱/值對,我只是想插入一個一行到卡桑德拉在單個請求/操作,它是儘可能快。
我似乎可以找到的唯一的事情就是做執行以下50000次:
INSERT INTO results (row_id, index, value) values (my_row_id, ?, ?);
第一?
是一個索引計數器(i
)和第二?
是存儲在文本值位置i
。
這需要很多時間。即使我們將上面的INSERT放入批處理中,也需要很長時間。
我們有完整的數據需求(完整的一行),我認爲這很簡單,只需說出「Cassandra,在一個請求中將這些數據作爲單行存儲」,例如:
//EXAMPLE-BUT-INVALID CQL3 SYNTAX:
insert into results (row_id, (index,value)) values
((0,text0), (1,text1), (2,text2), ..., (N,textN));
該實施例通過電流CQL3語法是不可能的,但希望它示出了所期望的效果:一切都將被插入作爲一個單一的查詢。
是否可以在CQL3和DataStax Java驅動程序中執行此操作?如果沒有,我想我會被迫使用Hector或Astyanax司機和Thrift batch_insert
操作?
您是否嘗試過使用列表/套/地圖它會更容易和更快,因爲他們會在批量啓用準備好的聲明。對於這種情況,它應該這樣做,但是,正如Alex所說,它會對CQL3做一個有趣的補充。 – jorgebg
是的,我們已經嘗試過了,而且速度相當快,但它完全打破了所需的數據模型:您無法對CQL3集合執行切片查詢。 –