zoukankan      html  css  js  c++  java
  • 转:在 CLI 中練習 Data Model

    前置說明

    在開始練習前,先作個小小的說明,同時也補充之前沒有提到的東西。首先 cassandra 的預設設定檔中已經有定義預設的 keyspace 跟 coulmns families,預設有一個 keyspace 為「Ketspace1」有四個 colimn family 分別是「Standard1」、「Standard2」、「StandardByUUID1」跟「Super1」,這四個 colimn family 詳細的差異會在後面的文章再補充。所以之前所使用的 keyspace 跟 colimn family 都是真實存在於 cassandra 裡面的。

    所有的紀錄都是以「key」來作識別,所以「key」不能重複。

    Column

    假設我們要在資料庫中產生以下的紀錄

    ian:{
        name: "Ian Wu"
    }
    john:{
        name: "John Li"
    }
    

    這兩筆紀錄很簡單,單純紀錄「key=ian」的紀錄,裡面包含了「name=Ian Wu」

    這時我們可以使用 set 指令來插入這兩筆紀錄。

    set Keyspace1.Standard1['ian']['name']='Ian Wu'
    set Keyspace1.Standard1['john']['name']='John Li'
    

    接著再利用 get 來讀取剛剛插入的兩筆紀錄

    cassandra> get Keyspace1.Standard1['ian']                 
    => (column=name, value=Ian Wu, timestamp=1270407235197)
    Returned 1 results.
    cassandra> get Keyspace1.Standard1['john']
    => (column=name, value=John Li, timestamp=1270407563029)
    Returned 1 results.
    

    再已存的紀錄中增加 column

    接著如果我們的紀錄要變更成以下的狀態的話

    ian:{
        name: "Ian Wu"
    }
    john:{
        name: "John Li"
        gender: "male"
    }
    

    一樣使用 set 將「john」新增的「gender=male」column 插入到「john」的紀錄中

    set Keyspace1.Standard1['john']['gender']='male'
    

    一樣再利用 get 來讀取這兩筆紀錄

    cassandra> get Keyspace1.Standard1['ian']                   
    => (column=name, value=Ian Wu, timestamp=1270407235197)
    Returned 1 results.
    cassandra> get Keyspace1.Standard1['john']                  
    => (column=name, value=John Li, timestamp=1270407830919)
    => (column=gender, value=male, timestamp=1270407845754)
    Returned 2 results
    

    我們可以看到「john」增加了「gender」這個 column,然而我們完全沒有修正任何的 schema 就可以達到增加欄位的功能,這可跟 RDBMS 有很大的不同。

    Super Column

    接著我們要來練習 super column,一樣,假設我們要在資料庫中產生以下的紀錄

    ian:{
        address: {
            city: "Taipei County"
            zip: "251"
        }
    }
    john:{
        address: {
            city: "Taipei City"
            zip: "104"
        }
    }
    

    一樣使用 set 指令來插入這兩筆紀錄,不過要注意的是 column family 要使用「Super1」才有支援 super column。

    set Keyspace1.Super1['ian']['address']['zip']='251'
    set Keyspace1.Super1['ian']['address']['city']='Taipei County'
    set Keyspace1.Super1['john']['address']['zip']='104'
    set Keyspace1.Super1['john']['address']['city']='Taipei City'
    

    接著再利用 get 來讀取剛剛插入的兩筆紀錄

    cassandra> get Keyspace1.Super1['ian']        
    => (super_column=address,
         (column=city, value=Taipei County, timestamp=1270408441168)
         (column=zip, value=251, timestamp=1270408426438))
    Returned 1 results.
    cassandra> get Keyspace1.Super1['john']
    => (super_column=address,
         (column=city, value=Taipei City, timestamp=1270408480625)
         (column=zip, value=104, timestamp=1270408459787))
    Returned 1 results.
    

    在這裡可以看到 super colimn 顯示的格式略有不同,不過原則上還是大同小異。

    Column Family 的注意事項

    在上面的例子中,我們已經使用到兩個 column family 分別是「Standard1」跟「Super1」,差異就是「Standard1」儲存 column;「Super1」儲存 super column,這裡有一點要特別注意,就是在 column family 內儲存的型態不能混用,也就是說「Standard1」不能存 super column;「Super1」不能存 column。

    像是在「Standard1」要加入 super column 就會出現以下的錯誤。

    cassandra> set Keyspace1.Standard1['ian']['addrss']['zip']='251'
    Exception null
    InvalidRequestException(why:supercolumn parameter is invalid for standard CF Standard1)
        at org.apache.cassandra.service.Cassandra$insert_result.read(Cassandra.java:9963)
        at org.apache.cassandra.service.Cassandra$Client.recv_insert(Cassandra.java:574)
        at org.apache.cassandra.service.Cassandra$Client.insert(Cassandra.java:547)
        at org.apache.cassandra.cli.CliClient.executeSet(CliClient.java:375)
        at org.apache.cassandra.cli.CliClient.executeCLIStmt(CliClient.java:63)
        at org.apache.cassandra.cli.CliMain.processCLIStmt(CliMain.java:131)
        at org.apache.cassandra.cli.CliMain.main(CliMain.java:172)
    

    或是在「Super1」要加入 column 就會出現以下的錯誤。

    cassandra> set Keyspace1.Super1['ian']['name'] = 'Ian Wu'           
    Exception null
    InvalidRequestException(why:supercolumn parameter is not optional for super CF Super1)
        at org.apache.cassandra.service.Cassandra$insert_result.read(Cassandra.java:9963)
        at org.apache.cassandra.service.Cassandra$Client.recv_insert(Cassandra.java:574)
        at org.apache.cassandra.service.Cassandra$Client.insert(Cassandra.java:547)
        at org.apache.cassandra.cli.CliClient.executeSet(CliClient.java:375)
        at org.apache.cassandra.cli.CliClient.executeCLIStmt(CliClient.java:63)
        at org.apache.cassandra.cli.CliMain.processCLIStmt(CliMain.java:131)
        at org.apache.cassandra.cli.CliMain.main(CliMain.java:172)

    原文链接  http://wiki.cheyingwu.tw/Java/Cassandra/data-model-cli-exercise

  • 相关阅读:
    2012年的结束
    学习嵌入式的点滴(一)
    面试的点滴(一)
    学习嵌入式的点滴(二)
    DB2 SQL脚本批量执行(转)
    联邦数据库的一个例子(转)
    在 DB2 9.7 for Linux, UNIX, and Windows 上运行 Oracle 应用程序(转)
    WINDOWS批处理命令详解(转)
    SQL1159 Initialization error with DB2 .NET Data Provider, reason code 2;reason code 10
    Oracle Package中的包变量的使用(转)
  • 原文地址:https://www.cnblogs.com/mobile/p/1754087.html
Copyright © 2011-2022 走看看