簡體   English   中英

使用CQL3在Cassandra中插入任意列

[英]Inserting arbitrary columns in Cassandra using CQL3

在CQL3之前,可以插入任意列,例如由日期命名的列:

cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY)
                WITH comparator=timestamp AND default_validation=text;
cqlsh:test>INSERT INTO seen_ships (day, '2013-02-02 00:08:22')
                VALUES ('Tuesday', 'Sunrise');

根據這篇文章 ,CQL3似乎有所不同。 是否仍然可以插入任意列? 這是我失敗的嘗試:

cqlsh:test>CREATE TABLE seen_ships (
    day text,
    time_seen timestamp,
    shipname text,
    PRIMARY KEY (day, time_seen)
);

cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

在這里我收到Bad Request: line 1:29 no viable alternative at input 'foo'

所以我嘗試了一個稍微不同的表,因為這可能是復合鍵的限制:

cqlsh:test>CREATE TABLE seen_ships ( day text PRIMARY KEY );
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

再次使用Bad Request: line 1:29 no viable alternative at input 'foo'

我在這里錯過了什么?

在Datastax博客上有一篇很好的博客文章: http ://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows

答案是肯定的,CQL3支持動態列,而不是它在早期版本的CQL中的工作方式。 我真的不明白你的例子,你將日期戳與字符串混合在一起我不知道它在CQL2中是如何工作的。 如果我理解正確你想要制作船舶目擊的時間表,那么分區鍵(行鍵)就是當天,每個目擊都是一個時間/名稱對。 這是一個建議:

CREATE TABLE ship_sightings (
  day TEXT,
  time TIMESTAMP,
  ship TEXT,
  PRIMARY KEY (day, time)
)

並插入條目

INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')

但是,您應該使用TIMEUUID而不是TIMESTAMP (並且主鍵可能是DATE ),否則您可能會添加兩個具有相同時間戳的目擊,並且只有一個會存活。

這是一個寬行的例子,但是有動態列的問題,這不是完全相同的事情。 以下是CQL3中的示例:

CREATE TABLE ship_sightings_with_properties (
  day TEXT,
  time TIMEUUID,
  ship TEXT,
  property TEXT,
  value TEXT,
  PRIMARY KEY (day, time, ship, property)
)

您可以像這樣插入:

INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')

這種動態列的缺點是屬性名稱將被存儲多次(因此,如果你連續觀察了一千個並且每個都有一個名為“Captain”的屬性,那么該字符串將被保存一千次)。 磁盤上的壓縮消除了大部分開銷,而且大部分時間都沒有什么可擔心的。

最后關於CQL3中的集合的注釋。 它們是一個有用的功能,但它們不是實現寬行或動態列的方法。 首先,他們有65536項限制,但Cassandra無法強制執行此限制,因此如果添加太多元素,您可能無法在以后閱讀它們。 集合主要用於小型多值字段 - 規范示例是地址簿,其中每行是條目,條目只有一個名稱,但有多個電話號碼,電子郵件地址等。

它不是真正的動態列,但大多數時候你可以逃避收藏。 使用Map列可以存儲一些動態數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM