溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Cassandra CQL v3.3中文文檔(上)

發(fā)布時(shí)間:2020-07-09 11:13:04 來源:網(wǎng)絡(luò) 閱讀:14015 作者:jijun87120681 欄目:開發(fā)技術(shù)

Cassandra Query Language (CQL)v3.3.0

1.        Cql語法

1.1.    前言

本文檔描述了CQL v3CQL v3CQL v2不兼容且在很多地方不同。

CQL v3提供了非常類似于SQL的數(shù)據(jù)模型,數(shù)據(jù)放在了包含rowscolumnstables中。因此,當(dāng)使用此文檔時(shí),這些內(nèi)容(tables,rows,columns)與SQL定義相同。但是rowscolumns其內(nèi)部實(shí)現(xiàn)的原理不同。

1.2.    約定

為了介紹CQL語法,文檔使用以下約定:

  • 語言規(guī)則使用類BNF符號(hào):

<start> ::= TERMINAL<non-terminal1> <non-terminal1>
  • 非終結(jié)符號(hào)<尖括號(hào)>。

  • 作為額外的BNF快捷符號(hào),使用傳統(tǒng)的正則表達(dá)式的符號(hào)(?+and*)表示是可選的,and/or可以重復(fù)。 [<characters>]符號(hào)表示任意一個(gè)<characters>

  • code塊提供了簡(jiǎn)單code

SELECT sample_usage FROM cql;

1.3. 標(biāo)識(shí)符和關(guān)鍵字

CQL語言使用標(biāo)識(shí)符(或名稱)來標(biāo)識(shí)tables,columns和其他對(duì)象。一個(gè)標(biāo)識(shí)符是一個(gè)令牌,與正則表達(dá)式一致[a-zA-Z][a-zA-Z0-9_]*。

一些標(biāo)識(shí)符,比如SELECTWITH,是關(guān)鍵字。他們有固定的意義且被保留的。

標(biāo)識(shí)符和關(guān)鍵字是大小寫不敏感的。因此SELECTselect,sElEcT相同。使用的常常約定關(guān)鍵字大寫,標(biāo)識(shí)符小寫。

1.4.    常量

CQL定義了下面類型的常量:stringsintegers,floats,booleansuuidsblobs

1.5.    注釋

CQL使用注釋:--//

多行注釋:/*   */

-- This is a comment
// This is a comment too
/* This is
   a multi-line comment */

1.6.    語句

SQL語句可以分為3類:

  • DDL:改變和設(shè)置數(shù)據(jù)存儲(chǔ)方式

  • DML:改變數(shù)據(jù)

  • Queries:查詢數(shù)據(jù)

所有語句以分號(hào)(;)結(jié)束,除了單條語句外。支持的語句如下:

<identifier> ::= any quoted or unquoted identifier, excluding reserved keywords
 <tablename> ::= (<identifier> '.')? <identifier>
 
    <string> ::= a string constant
   <integer> ::= an integer constant
     <float> ::= a float constant
    <number> ::= <integer> | <float>
      <uuid> ::= a uuid constant
   <boolean> ::= a boolean constant
       <hex> ::= a blob constant
 
  <constant> ::= <string> | <number>| <uuid>| <boolean> | <hex>
  <variable> ::= '?' | ':' <identifier>
      <term> ::= <constant>| <collection-literal> | <variable> | <function> '(' (<term> (',' <term>)*)? ')'
 
  <collection-literal> ::= <map-literal>
                         | <set-literal>
                         | <list-literal>
         <map-literal> ::= '{' ( <term> ':' <term> ( ',' <term> ':' <term> )* )? '}'
         <set-literal> ::= '{' ( <term> ( ',' <term> )* )? '}'
        <list-literal> ::= '[' ( <term> ( ',' <term> )* )? ']'
 
    <function> ::= <ident>
 
  <properties> ::= <property> (AND <property>)*
    <property> ::= <identifier> '=' ( <identifier> | <constant> | <map-literal> )


上面語法在實(shí)際中并不是所有的都是合法的。最顯著的是,<variable>和嵌套<collection-literal><collection-literal>中是不被允許的。

<variable>可以是匿名(一個(gè)問號(hào)?)也可以命名(:之前的一個(gè)標(biāo)識(shí))。唯一區(qū)別就是命名更容易被引用。

<properties>用來創(chuàng)建或修改keyspacestables。每一個(gè)<properties>類型可以是simplemap

<tablename>用來標(biāo)識(shí)一個(gè)table。表示一個(gè)表名。

1.7.    Prepared Statement

CQL支持prepared statements

支持LIMIT,TIMESTAMPTTL從句

2.  DDL

2.1.    CREATE KEYSPACE

語法:

<create-keyspace-stmt> ::= CREATE KEYSPACE (IF NOT EXISTS)? <identifier> WITH <properties>

樣例:

CREATE KEYSPACE Excelsior
           WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
 
CREATE KEYSPACE Excalibur
           WITH replication = {'class': 'NetworkTopologyStrategy', 'DC1' : 1, 'DC2' : 3}
            AND durable_writes = false

CREATE KEYSPACE語句用來創(chuàng)建一個(gè)新的頂級(jí)keyspace。Keyspace是一個(gè)命名空間,定義了復(fù)制策略和tables的其他選項(xiàng)集合。合法的keyspaces名稱是由數(shù)字和字母組成的,長(zhǎng)度小于32為的標(biāo)識(shí)。注意,keyspace命名是大小寫不敏感的。

CREATE KEYSPACE支持的<properties>

name

kind

mandatory

default

description

replication

map

yes


復(fù)制策略和使用keyspace選項(xiàng)

durable_writes

simple

no

true

是否使用commit log對(duì)于更新keyspace

replication <property>是必選的。Cassandra支持以下的‘class’

  • ‘SimpleStrategy’:一個(gè)簡(jiǎn)單策略,定義了簡(jiǎn)單的復(fù)制因子在整個(gè)集群集群中。只支持‘replication_factor’一個(gè)子選項(xiàng),定義復(fù)制因子且是必選項(xiàng)。

l   ‘NetworkTopologyStrategy’:可以為每個(gè)數(shù)據(jù)中心定義單獨(dú)的復(fù)制因子。子選項(xiàng)以key-value方式定義,key表示數(shù)據(jù)中心名稱,value表示此數(shù)據(jù)中心的復(fù)制因子。

  • ‘OldNetworkTopologyStrategy’: 遺留的復(fù)制策略。應(yīng)該避免使用,而盡量使用‘NetworkTopologyStrategy’。

試圖創(chuàng)建一個(gè)已經(jīng)存在的keyspace將返回一個(gè)錯(cuò)誤,除非使用IF NOT EXISTS選項(xiàng)。如果使用它,語句將是空操作如果keyspace已經(jīng)存在。

2.2.    USE

語法:

<use-stmt> ::= USE <identifier>

樣例:

USE myApp

         USE語句使用已經(jīng)存在的keyspace名稱作為參數(shù),設(shè)置此keyspace作為每次連接的當(dāng)前工作keyspace。

2.3.    ALTER KEYSPACE

語法:

<create-keyspace-stmt> ::= ALTER KEYSPACE <identifier> WITH <properties>


樣例:

ALTER KEYSPACE Excelsior
          WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 4};


ALTERKEYSPACE語句修改keyspace的屬性。支持的<properties>與CREATE KEYSPACE相同。

2.4.    DROP KEYSPACE

語法:

<drop-keyspace-stmt> ::= DROP KEYSPACE ( IF EXISTS )? <identifier>


樣例:

DROP KEYSPACE myApp;


DROP KEYSPACE語句執(zhí)行結(jié)果是,及時(shí)且不可逆的刪除keyspace,包括keyspace中的所有column families,以及包含在column families中的所有數(shù)據(jù)。

2.5.    CREATE TABLE

語法:

<create-table-stmt> ::= CREATE ( TABLE | COLUMNFAMILY ) ( IF NOT EXISTS )? <tablename>
                          '(' <column-definition> ( ',' <column-definition> )* ')'
                          ( WITH <option> ( AND <option>)* )?
 
<column-definition> ::= <identifier> <type> ( STATIC )? ( PRIMARY KEY )?
                      | PRIMARY KEY '(' <partition-key> ( ',' <identifier> )* ')'
 
<partition-key> ::= <identifier>
                  | '(' <identifier> (',' <identifier> )* ')'
 
<option> ::= <property>
           | COMPACT STORAGE
           | CLUSTERING ORDER


樣例:

CREATE TABLE monkeySpecies (
    species text PRIMARY KEY,
    common_name text,
    population varint,
    average_size int
) WITH comment='Important biological records'
   AND read_repair_chance = 1.0;
 
CREATE TABLE timeline (
    userid uuid,
    posted_month int,
    posted_time uuid,
    body text,
    posted_by text,
    PRIMARY KEY (userid, posted_month, posted_time)
) WITH compaction = { 'class' : 'LeveledCompactionStrategy' };


CREATE TABLE語句創(chuàng)建一個(gè)新的table。每個(gè)table都是rows的集合(常常表示相關(guān)實(shí)體),定義了一些屬性。注意,CREATE COLUMNFAMILY語法是支持的,作為CREATE TABLE的別名(由于歷史原因)。

試圖創(chuàng)建一個(gè)已經(jīng)存在的table將返回一個(gè)錯(cuò)誤,除非使用IF NOT EXISTS選項(xiàng)。如果使用它,語句將是空操作如果table已經(jīng)存在。

 


2.5.1.  <tablename>

合法的table名稱與keyspace名稱規(guī)則相同(長(zhǎng)度到32字符的字母數(shù)字標(biāo)識(shí)符)。

2.5.2.  <column-definition>

CREATETABLE語句定義了tablerows所擁有的columnscolumn由它的名稱和類型定義。

table內(nèi),rowPRIMARY KEY唯一標(biāo)識(shí)。所以所有的table必須定義一個(gè)PRIMARY KEY。一個(gè)PRIMARY KEY可以由一個(gè)或多個(gè)columns組成。如果PRIMARY KEY只有一個(gè)column,則可以直接在此column之后定義。否則PRIMARY KEY必須逗號(hào)分割,以括號(hào)包含多個(gè)columns來定義。注意:

CREATE TABLE t (
    kint PRIMARY KEY,
   other text
)


等價(jià)于

CREATE TABLE t (
    kint,
   other text,
   PRIMARY KEY (k)
)


2.5.3.  Partition key clusteringcolumns

CQL中,列的順序定義了主鍵。第一個(gè)columnkey稱為partition key。所有的rows共享相同的partition key(甚至在跨表中),則存儲(chǔ)在相同的物理節(jié)點(diǎn)上。注意,可能會(huì)存在復(fù)合partition key,比如partition key由多個(gè)columns組成,使用括號(hào)包含多個(gè)columns組成partition key。

PRIMARYKEY中剩下的columns,則成為clustering columns。在給定的物理節(jié)點(diǎn)和給定的partition key上,clustering columns決定了存儲(chǔ)的順序,使得在clustering columns查詢時(shí)效率很高。

2.5.4.  STATIC columns

一些columns可以聲明為STATIC,column聲明為static將被擁有相同partition的所有rows共享(即擁有相同的partition key)。例如:

CREATE TABLE test (
    pk int,
    t int,
    v text,
    s text static,
    PRIMARY KEY (pk, t)
);
INSERT INTO test(pk, t, v, s) VALUES (0, 0, 'val0', 'static0');
INSERT INTO test(pk, t, v, s) VALUES (0, 1, 'val1', 'static1');
SELECT * FROM test WHERE pk=0 AND t=0;


最后查詢語句,s的值為‘static1

使用static columns有以下限制:

  • tableCOMPACT STORAGE項(xiàng)不能為static

  • 一個(gè)table如果沒有clustering columns,則不能有static columns(因?yàn)?/span>table沒有clustering columns,則每個(gè)partition有且僅有一行,則每個(gè)column都是static

  • 只有非PRIMARY KEYcolumns才能為static

  •   <option>

CREATETABLE語句支持一些options來配置新的table。這些options被定義在WITH之后。

         第一個(gè)optionCOMPACT STORAGE。這個(gè)選項(xiàng)主要是針對(duì)向后兼容性,對(duì)于定義CQL3之前創(chuàng)建的table。這個(gè)選項(xiàng)提供了在磁盤上更緊湊的布局,但代價(jià)是減少了table的靈活性和可擴(kuò)展性。最顯著的是,COMPACT STORAGE不支持collectionsstatic columns,且COMPACT STORAGE表至少有一個(gè)clustering columns。由于這些原因,COMPACT STORAGE不建議使用。

         另一個(gè)optionCLUSTERING ORDER。它允許定義rows在磁盤的順序。

         表的創(chuàng)建支持以下的<property>

option

kind

default

description

comment

simple

none

注釋

read_repair_chance

simple

0.1

查詢額外節(jié)點(diǎn)的概率對(duì)于read  repairs

dclocal_read_repair_chance

simple

0

查詢額外節(jié)點(diǎn)的概率對(duì)于本地?cái)?shù)據(jù)中心的read repairs

gc_grace_seconds

simple

864000

等待垃圾回收的時(shí)間

bloom_filter_fp_chance

simple

0.00075

SSTable  bloom filterfalse positive的目標(biāo)概率(降低此值將會(huì)影響bloom filter在內(nèi)存和磁盤的大?。?/span>

compaction

simple

see  below

The  compaction options to use, see below.

compression

simple

see  below

Compression  options, see below.

caching

simple

keys_only

是否緩存keys(“key cache”)rows(“row cache”)對(duì)于此table。合法的值為:all,keys_only,rows_onlynone

default_time_to_live

simple

0

table缺省的過期時(shí)間,單位為秒

2.5.6.  compaction options

compaction屬性為’class’子選項(xiàng),定義了壓縮策略。默認(rèn)支持的class'SizeTieredCompactionStrategy' 'LeveledCompactionStrategy'

option

supported  compaction strategy

default

description

enabled

all

true

Boolean表示compaction是否開啟

tombstone_threshold

all

0.2

如果SSTablegcable  tombstones超過這個(gè)比率,則SSTable將會(huì)進(jìn)行壓縮來清楚這些tombstones

tombstone_compaction_interval

all

1  day

SSTable等待時(shí)間對(duì)于tombstone compaction”,其中“tombstone compaction”會(huì)促發(fā)壓縮,如果SSTablegcable tombstones查過tombstone_threshold

unchecked_tombstone_compaction

all

false

設(shè)置true則開啟更激進(jìn)的tombstone compaction,單個(gè)SSTabletombstone compaction運(yùn)行將不會(huì)檢查

min_sstable_size

SizeTieredCompactionStrategy

50MB

SSTable壓縮的大小分層策略

min_threshold

SizeTieredCompactionStrategy

4

SSTable最小數(shù)量,需要開啟次要compaction

max_threshold

SizeTieredCompactionStrategy

32

SSTable通過次要compaction處理的最大數(shù)量

bucket_low

SizeTieredCompactionStrategy

0.5

SSTablebucket大小在[average_size * bucket_low, average_size *  bucket_high]

bucket_high

SizeTieredCompactionStrategy

1.5

SSTablebucket大小在[average_size * bucket_low, average_size *  bucket_high]

sstable_size_in_mb

LeveledCompactionStrategy

5MB

SSTableleveled strategy中的大小。注意SSTable大小應(yīng)該小于或等于sstable_size_in_mb

2.5.7.  Compression屬性

option

default

description

sstable_compression

LZ4Compressor

Compression算法,默認(rèn)有:LZ4Compressor,SnappyCompressorDeflateCompressor。使用string’’)關(guān)閉Compression

chunk_length_kb

64KB

SSTable壓縮的塊大小。增大此值可以提高壓縮效率,但增加了從磁盤讀取數(shù)據(jù)的最小數(shù)量

crc_check_chance

1.0

啟用壓縮時(shí),每個(gè)壓縮塊包含一個(gè)校驗(yàn),目的是為了檢測(cè)磁盤bitrot,避免臟數(shù)據(jù)的傳播到其他副本。默認(rèn)總是檢查,設(shè)置為0則關(guān)閉檢查,0.5則每隔一個(gè)讀檢查一次

2.6.    ALTER TABLE

語法:

<alter-table-stmt> ::= ALTER (TABLE | COLUMNFAMILY) <tablename> <instruction>
 
<instruction> ::= ALTER <identifier> TYPE <type>
                | ADD   <identifier> <type>
                | DROP  <identifier>
                | WITH  <option> ( AND <option> )*


樣例:

ALTER TABLE addamsFamily
ALTER lastKnownLocation TYPE uuid;
 
ALTER TABLE addamsFamily
ADD gravesite varchar;
 
ALTER TABLE addamsFamily
WITH comment = 'A most excellent and useful column family'
 AND read_repair_chance = 0.2;


2.7.    DROP TABLE

語法:

<drop-table-stmt> ::= DROP TABLE ( IF EXISTS )? <tablename>


樣例:

DROP TABLE worldSeriesAttendees;


2.8.    TRUNCATE

語法:

<truncate-stmt> ::= TRUNCATE <tablename>


樣例:

TRUNCATE superImportantData;


TRUNCATE語句將會(huì)完全刪除所有table的數(shù)據(jù)

2.9.    CREATE INDEX

語法:

<create-index-stmt> ::= CREATE ( CUSTOM )? INDEX ( IF NOT EXISTS )? ( <indexname> )?
                            ON <tablename> '(' <index-identifier> ')'
                            ( USING <string> ( WITH OPTIONS = <map-literal> )? )?
 
<index-identifier> ::= <identifier>
                     | keys( <identifier> )


樣例:

CREATE INDEX userIndex ON NerdMovies (user);
CREATE INDEX ON Mutants (abilityId);
CREATE INDEX ON users (keys(favs));
CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass';
CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass' WITH OPTIONS = {'storage': '/mnt/ssd/indexes/'};


    使用CREATE INDEX語句創(chuàng)建二次索引對(duì)于給定的column。索引的名稱可以在ON關(guān)鍵字之前定義。如果數(shù)據(jù)已經(jīng)存在對(duì)于此column,則將會(huì)異步創(chuàng)建索引。在索引創(chuàng)建之后,新插入的數(shù)據(jù)將會(huì)自動(dòng)索引。

    試圖創(chuàng)建一個(gè)已經(jīng)存在的index將返回一個(gè)錯(cuò)誤,除非使用IF NOT EXISTS選項(xiàng)。如果使用它,語句將是空操作如果index已經(jīng)存在。

2.9.1.  Indexes on Map Keys

    當(dāng)在map column上創(chuàng)建索引時(shí),可以索引keysvalues。如果column標(biāo)識(shí)符放在keys()函數(shù)中,則將會(huì)在map keys上創(chuàng)建索引,允許在WHERE從句中使用CONTAINS KEY,否則索引將在map values上。

2.10.DROP INDEX

語法:

<drop-index-stmt> ::= DROP INDEX ( IF EXISTS )? ( <keyspace> '.' )? <identifier>


樣例:

DROP INDEX userIndex;
DROP INDEX userkeyspace.address_index;


2.11.CREATE TYPE

語法:

<create-type-stmt> ::= CREATE TYPE ( IF NOT EXISTS )? <typename>
                         '(' <field-definition> ( ',' <field-definition> )* ')'
<typename> ::= ( <keyspace-name> '.' )? <identifier>
<field-definition> ::= <identifier> <type>


樣例:

CREATE TYPE address (
    street_name text,
    street_number int,
    city text,
    state text,
    zip int
)
CREATE TYPE work_and_home_addresses (
    home_address address,
    work_address address
)



        CREATETYPE語句創(chuàng)建新的用戶定義類型。每個(gè)類型都是一組名稱,類型字段的集合。字段類型可以是任何合法類型,包含集合和其他存在的用戶定義類型

    試圖創(chuàng)建一個(gè)已經(jīng)存在的type將返回一個(gè)錯(cuò)誤,除非使用IF NOT EXISTS選項(xiàng)。如果使用它,語句將是空操作如果type已經(jīng)存在

2.12.ALTER TYPE

語法:

<alter-type-stmt> ::= ALTER TYPE <typename> <instruction>
 
<instruction> ::= ALTER <field-name> TYPE <type>
                | ADD <field-name> <type>
                | RENAME <field-name> TO <field-name> ( AND <field-name> TO <field-name> )*


樣例:

ALTER TYPE address ALTER zip TYPE varint
ALTER TYPE address ADD country text
ALTER TYPE address RENAME zip TO zipcode AND street_name TO street


2.13.DROP TYPE

語法:

<drop-type-stmt> ::= DROP TYPE ( IF EXISTS )? <typename>


2.14. CREATE TRIGGER

語法:

<create-trigger-stmt> ::= CREATE TRIGGER ( IF NOT EXISTS )? ( <triggername> )?
                            ON <tablename> 
                            USING <string>


樣例:

CREATE TRIGGER myTrigger ON myTable USING 'org.apache.cassandra.triggers.InvertedIndex';


trigger的邏輯可以使用java語言編寫,存在與外部數(shù)據(jù)庫(kù)中。放入trigger代碼在Cassandralib/triggers的子目錄下,當(dāng)集群?jiǎn)?dòng)時(shí),會(huì)自動(dòng)加載此trigger。在執(zhí)行DML語句時(shí)trigger將被觸發(fā),請(qǐng)確保事物的原子性。

2.15.DROP TRIGGER

語法:

<drop-trigger-stmt> ::= DROP TRIGGER ( IF EXISTS )? ( <triggername> )?
                            ON <tablename>


樣例:

DROP TRIGGER myTrigger ON myTable;


2.16.CREATE FUNCTION

語法:

<create-function-stmt> ::= CREATE ( OR REPLACE )? 
                            FUNCTION ( IF NOT EXISTS )?
                            ( <keyspace> '.' )? <function-name>
                            '(' <arg-name> <arg-type> ( ',' <arg-name> <arg-type> )* ')'
                            ( CALLED | RETURNS NULL ) ON NULL INPUT
                            RETURNS <type>
                            LANGUAGE <language>
                            AS <body>


樣例:

CREATE OR REPLACE FUNCTION somefunction
    ( somearg int, anotherarg text, complexarg frozen<someUDT>, listarg list<bigint> )
    RETURNS NULL ON NULL INPUT
    RETURNS text
    LANGUAGE java
    AS $$
       // some Java code
    $$;
CREATE FUNCTION akeyspace.fname IF NOT EXISTS
    ( someArg int )
    CALLED ON NULL INPUT
    RETURNS text
    LANGUAGE java
    AS $$
       // some Java code
    $$;


CREATEFUNCTION會(huì)創(chuàng)建或替換一個(gè)用戶自定義函數(shù)。

2.16.1.          Function Signature

keyspace名稱,函數(shù)名稱,參數(shù)類型是主體,大小寫敏感

CREATEFUNCTION帶著OR REPLACE選項(xiàng)表示創(chuàng)建或替換已經(jīng)存在的signature。CREATE FUNCTION不帶OR REPLACE,則已經(jīng)存在相同的signature會(huì)失敗。

調(diào)用帶有null的值必須在函數(shù)中聲明。有兩種選項(xiàng):

  • RETURNS NULL ON NULL INPUT聲明函數(shù)總是返回null,如果存在任何參數(shù)為null

  • CALLED ON NULL INPUT聲明函數(shù)總是會(huì)執(zhí)行。

如果IF NOT EXISTS選項(xiàng)存在,則函數(shù)只會(huì)被創(chuàng)建,如果相同函數(shù)簽名不存在。

ORREPLACEIF NOT EXISTS不能同時(shí)使用。

更多詳情請(qǐng)查看user-defined functions

2.17.DROP FUNCTION

語法:

<drop-function-stmt>::= DROP FUNCTION ( IF EXISTS )?
                         ( <keyspace> '.')? <function-name>
                         ( '(' <arg-type>( ',' <arg-type> )* ')' )?


樣例:

DROP FUNCTIONmyfunction;
DROP FUNCTIONmykeyspace.afunction;
DROP FUNCTIONafunction ( int );
DROP FUNCTIONafunction ( text );


2.18.CREATE AGGREGATE

語法:

<create-aggregate-stmt> ::= CREATE ( OR REPLACE )? 
                            AGGREGATE ( IF NOT EXISTS )?
                            ( <keyspace> '.' )? <aggregate-name>
                            '(' <arg-type> ( ',' <arg-type> )* ')'
                            SFUNC ( <keyspace> '.' )? <state-functionname>
                            STYPE <state-type>
                            ( FINALFUNC ( <keyspace> '.' )? <final-functionname> )?
                            ( INITCOND <init-cond> )?


樣例:

CREATE AGGREGATE myaggregate ( val text )
  SFUNC myaggregate_state
  STYPE text
  FINALFUNC myaggregate_final
  INITCOND 'foo';


更多詳情請(qǐng)查看user-defined aggregates

STYPE定義了正式的值的類型,必須被聲明。

選項(xiàng)INITCOND定義了aggregate的初始化狀態(tài)值。默認(rèn)為null

SFUNC引用現(xiàn)有的函數(shù)作為正式的修改函數(shù)。函數(shù)第一個(gè)參數(shù)類型必須與STYPE匹配。函數(shù)剩下的參數(shù)類型必須匹配聚合函數(shù)的參數(shù)類型。

FINALFUNC在聚合結(jié)果返回之前調(diào)用。它必須帶有一個(gè)STYPE類型的參數(shù)。FINALFUNC返回類型可以是不同的類型。FINALFUNC函數(shù)聲明帶有RETURNS NULL ON NULL INPUT意味著聚合返回值將會(huì)是null。

如果沒有定義FINALFUNC,聚合函數(shù)返回類型為STYPE。如果定義了FINALFUNC,則返回此函數(shù)類型

2.19.DROP AGGREGATE

語法:

<drop-aggregate-stmt> ::= DROP AGGREGATE ( IF EXISTS )?
                         ( <keyspace> '.' )? <aggregate-name>
                         ( '(' <arg-type> ( ',' <arg-type> )* ')' )?


樣例:

DROP AGGREGATE myAggregate;
DROP AGGREGATE myKeyspace.anAggregate;
DROP AGGREGATE someAggregate ( int );
DROP AGGREGATE someAggregate ( text );


3.  DML

3.1.    INSERT

語法:

<insertStatement> ::= INSERT INTO <tablename>
                      ( ( <name-list> VALUES <value-list> )
                      | ( JSON <string> ))
                      ( IF NOT EXISTS )?
                      ( USING <option> ( AND <option> )* )?
<names-list> ::= '(' <identifier> ( ',' <identifier> )* ')'
 
<value-list> ::= '(' <term-or-literal> ( ',' <term-or-literal> )* ')'
 
<term-or-literal> ::= <term>
                    | <collection-literal>
 
<option> ::= TIMESTAMP <integer>
           | TTL <integer>


樣例:

INSERT INTO NerdMovies (movie, director, main_actor, year)
                VALUES ('Serenity', 'Joss Whedon', 'Nathan Fillion', 2005) USING TTL 86400;
INSERT INTO NerdMovies JSON '{"movie": "Serenity", "director": "Joss Whedon", "year": 2005}'


INSERT語句寫入一個(gè)或多個(gè)columns對(duì)于在table中給定的row。

當(dāng)使用VALUES語法時(shí),columns列表必須提供。當(dāng)使用JSON語法時(shí),columns列表是可選的。

注意,與SQL不同,INSERT不會(huì)檢查row是否存在:當(dāng)不存在則創(chuàng)建,否則更新。

但是當(dāng)使用IF NOT EXISTS時(shí),只會(huì)進(jìn)行插入操作當(dāng)row不存在時(shí)。注意,使用IF NOT EXISTS將會(huì)引來不可忽略的性能問題(內(nèi)部使用Paxos算法),所以盡量少用

<option>請(qǐng)參考update部分。同樣注意INSERT不支持counters,而UPDATE支持。

3.2.    UPDATE

語法:

<update-stmt> ::= UPDATE <tablename>
                  ( USING <option> ( AND <option> )* )?
                  SET <assignment> ( ',' <assignment> )*
                  WHERE <where-clause>
                  ( IF <condition> ( AND condition )* )?
 
<assignment> ::= <identifier> '=' <term>
               | <identifier> '=' <identifier> ('+' | '-') (<int-term> | <set-literal> | <list-literal>)
               | <identifier> '=' <identifier> '+' <map-literal>
               | <identifier> '[' <term> ']' '=' <term>
 
<condition> ::= <identifier> '=' <term>
              | <identifier> '[' <term> ']' '=' <term>
 
<where-clause> ::= <relation> ( AND <relation> )*
 
<relation> ::= <identifier> '=' <term>
             | <identifier> IN '(' ( <term> ( ',' <term> )* )? ')'
             | <identifier> IN '?'
 
<option> ::= TIMESTAMP <integer>
           | TTL <integer>


樣例:

UPDATE NerdMovies USING TTL 400
SET director = 'Joss Whedon',
    main_actor = 'Nathan Fillion',
    year = 2005
WHERE movie = 'Serenity';
UPDATE UserActions SET total = total + 2 
WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14 AND action = 'click';

UPDATE語句寫入一個(gè)或多個(gè)columns對(duì)于給定的row。<where-clause>用來查詢更新的row,必須包含組成PRIMARY KEY的所有的columnsIN只支持partition key的最后一個(gè)column。其他columns值通過<assignment>指定在SET關(guān)鍵字之后。

注意,與SQL不同,UPDATE不會(huì)檢查row是否存在:當(dāng)不存在則創(chuàng)建,否則更新。

如果使用了IF條件,則必須同時(shí)滿足IF條件才會(huì)更新。使用IF將會(huì)引來不可忽略的性能問題(內(nèi)部使用Paxos算法),所以盡量少用

         <assignment>c = c + 3的格式表示增加/減少counterscounters只支持增加/減少,而不支持賦予特定的值)。

3.2.1.  <options>

UPDATEINSERT支持下面的選項(xiàng):

  • TIMESTAMP:設(shè)置操作的timestamp。如果沒有指定,則coordinator將會(huì)使用當(dāng)前時(shí)間(單位毫秒)。

  • TTL:允許指定插入值的存活事件(單位秒)。如果設(shè)置了,則在指定時(shí)間之后,數(shù)據(jù)庫(kù)將自動(dòng)刪除。注意,TTL關(guān)注點(diǎn)為插入的值,這意味著后面的更新將會(huì)重置TTL。默認(rèn)地,值永遠(yuǎn)不會(huì)過期。TTL0或負(fù)數(shù)等價(jià)于沒有TTL。

  • DELETE

語法:

<delete-stmt> ::= DELETE ( <selection> ( ',' <selection> )* )?
                  FROM <tablename>
                  ( USING TIMESTAMP <integer>)?
                  WHERE <where-clause>
                  ( IF ( EXISTS | ( <condition> ( AND <condition> )*) ) )?
 
<selection> ::= <identifier> ( '[' <term> ']' )?
 
<where-clause> ::= <relation> ( AND <relation> )*
 
<relation> ::= <identifier> '=' <term>
             | <identifier> IN '(' ( <term> ( ',' <term> )* )? ')'
             | <identifier> IN '?'
 
<condition> ::= <identifier> '=' <term>
              | <identifier> '[' <term> ']' '=' <term>


樣例:

DELETE FROM NerdMovies USING TIMESTAMP 1240003134 WHERE movie = 'Serenity';
DELETE phone FROM Users WHERE userid IN (C73DE1D3-AF08-40F3-B124-3FF3E5109F22, B70DE1D0-9908-4AE3-BE34-5573E5B09F14);

DELETE語句刪除columnsrows。<where-clause>可以指定keyrows被刪除(IN只支持partition key的最后一個(gè)column)。

DELETE支持的TIMESTAMP選項(xiàng)與UPDATE相同。

DELETE操作可以使用與UPDATEINSERT類似IF條件。但是注意,使用IF將會(huì)引來不可忽略的性能問題(內(nèi)部使用Paxos算法),所以盡量少用

3.4.    BATCH

語法:

<batch-stmt> ::= BEGIN ( UNLOGGED | COUNTER ) BATCH
                 ( USING <option> ( AND <option> )* )?
                    <modification-stmt> ( ';' <modification-stmt> )*
                 APPLY BATCH
 
<modification-stmt> ::= <insert-stmt>
                      | <update-stmt>
                      | <delete-stmt>
 
<option> ::= TIMESTAMP <integer>


樣例:

BEGIN BATCH
  INSERT INTO users (userid, password, name) VALUES ('user2', 'ch@ngem3b', 'second user');
  UPDATE users SET password = 'ps22dhds' WHERE userid = 'user3';
  INSERT INTO users (userid, password) VALUES ('user4', 'ch@ngem3c');
  DELETE name FROM users WHERE userid = 'user1';
APPLY BATCH;

BATCH語句組合多個(gè)語句(插入,修改和刪除)到一條語句中。有以下一個(gè)目的:

  • 當(dāng)批量更新時(shí),保存了clientserver網(wǎng)絡(luò)連接

  • 所有的批量更新屬于給定的partition key,被單獨(dú)執(zhí)行。

  • 默認(rèn),所有批量操作被自動(dòng)完成。

注意:

  • BATCH語句只能包含UPDATE,INSERTDELETE語句。

  • Batches不完全類似與SQL事物。

  • 如果每個(gè)操作沒有指定timestamp,則所有操作將使用同一個(gè)timestamp。

  •   UNLOGGED

默認(rèn)地,Cassandra使用batch log來確保所有的操作自動(dòng)批處理執(zhí)行。

當(dāng)batch跨越多個(gè)partitions時(shí),會(huì)帶來性能損失。如果你不想引來此損失,可以使用UNLOGGED選項(xiàng)來告訴Cassandra跳過batch log。如果使用UNLOGGED,則操作將會(huì)在一個(gè)partition中執(zhí)行。

3.4.2.  COUNTER

使用COUNTER選項(xiàng)來批量更新counter。不像Cassandra的其他更新,counter更新不是冪等的。

3.4.3.  <option>

BATCH也支持TIMESTAMP選項(xiàng),與UPDATE語句描述類似。但是如果使用的話,TIMESTAMP則不能夠在batch內(nèi)部的語句使用


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI