Cassandra MLB 狀況劇 (0) 建立表單

想說寫點 Cassandra 的筆記,但單純敘述各種用法也是滿無聊的。我去 FAN GRAPHS上找些表格,實際示範如何在 Cassandra shell 中紀錄這些資料。

今天要做的事情就是把下面的表格選幾個欄位轉存起來,完整資料來自https://www.fangraphs.com/teams/redsox):

shell 操作流程:

  1. 建立一個名為 redsox 的 keyspace(class='SimpleStrategy', replication_factor=1)
  2. 建立一個名為 pitchers 的 table,table 包含 Name, G, GS 和 IP 等欄位。
  3. 我們把名字設成主鍵(假設名字沒有重複)
  4. 匯入資料
  5. 查詢資料
  6. 刪除 table
  7. 刪除 keyspace

1. 建立一個名為 redsox 的 keyspace:

用終端機開啟 cassandra shell:

$ cqlsh

建立 keyspace,SimpleStrategy 用於 standalone data center,replication_factor 是資料複製的份數:

CREATE KEYSPACE redsox WITH replication = {
 'class': 'SimpleStrategy', 
 'replication_factor': 1
};

觀察 keyspace:

DESCRIBE KEYSPACES ;

除了 default 的 keyspace 外我們還多了 redsox。

system_schema  system_auth  system  system_distributed  redsox  system_traces

2. 建立一個名為 pitchers 的 table:

使用 redsox 這個 keyspace

USE redsox ;

這時候 shell 會變成 cqlsh:redsox>。

建立 pitchers 表單,並幫其欄位設置型態。tinyint 是 8 bits 有號整數,應該不會有投手一季可以先發超過 +128 場 XD:

CREATE TABLE pitchers (
  name text, 
  g tinyint , 
  gs tinyint , 
  ip float, 
  PRIMARY KEY(name)
);

我們將 name 設為主鍵,如果沒有設定其它鍵之後我們查詢時只能以 name 為條件查詢。

觀察一下 table:

DESCRIBE TABLE pitchers ;

CREATE TABLE redsox.pitchers (
    name text PRIMARY KEY,
    g tinyint,
    gs tinyint,
    ip float
) ...

3. 開始灌香腸:

來把資料輸進 table 裡:

INSERT INTO pitchers (name , g, gs, ip) 
  VALUES ( 'Rick Porcello', 25, 25, 151.2) ;

觀察一下表格目前的狀態,星號代表所有 columns:

SELECT * FROM redsox.pitchers ;

 name          | g  | gs | ip
---------------+----+----+-------
 Rick Porcello | 25 | 25 | 151.2

再塞一筆資料:

INSERT INTO pitchers (name, g, gs, ip) 
  VALUES ( 'Chris Sale', 23, 23, 146.0);

查看表格目前的狀態,注意這次我沒有指定 keyspace,因為 keyspace 其實是可以省略的:

SELECT * FROM pitchers ;

 name          | g  | gs | ip
---------------+----+----+-------
 Rick Porcello | 25 | 25 | 151.2
    Chris Sale | 23 | 23 |   146

4. 查詢資料:

我們一直在用的 SELECT 其實就是查詢啦,比方說我要取得 Sale 的所有資料:

SELECT * FROM pitchers WHERE name='Chris Sale' ;

 name       | g  | gs | ip
------------+----+----+-----
 Chris Sale | 23 | 23 | 146

假設我只關心 Sale 目前的投球局數,可以用下面的方法只列出名字和局數:

SELECT name, ip FROM pitchers WHERE name='Chris Sale' ;

 name       | ip
------------+-----
 Chris Sale | 146

!! 注意,目前我們的鍵只有 name 所以我們只以 name 為條件進行查詢 !!


5. 刪除 table:

如果都玩夠了我們來把 table 刪掉:

DROP TABLE pitchers ;

查看一下 redsox 底下所有的 tables:

DESCRIBE TABLES ;

<empty>

6. 刪除 keyspace

最後也把 redsox 殺了,不留一點痕跡:

DROP KEYSPACE redsox ;
DESCRIBE KEYSPACES ;

system_schema  system_auth  system  system_distributed  system_traces

留言

熱門文章