Changes between Version 2 and Version 3 of waue/2010/0402


Ignore:
Timestamp:
Apr 22, 2010, 10:50:33 AM (14 years ago)
Author:
waue
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • waue/2010/0402

    v2 v3  
    99[[PageOutline]]
    1010 = 零、前言 =
     11
     12 * thrift 是透過非java的其他程式語言,直接對hbase 進行存取的中介函式庫
     13 * ''''' 此篇介紹的是如何用php透過 thrift 對 hbase 操作 '''''
     14
    1115 * 程式安裝測試方法已紀錄於: [wiki:waue/2010/0401 安裝編譯及測試 ]
    1216 * 因此目錄結構為
    13  || hadoop || /opt/hadoop ||  ||
    14  || hbase || /opt/hbase ||  ||
    15  || 網頁根目錄 || /var/www/ ||  ||
    16  || hbase 的php碼目錄 || /var/www/hbase ||  ||
    17  || thrift php || /var/www/hbase/thrift ||  ||
     17
     18 || hadoop || /opt/hadoop || 
     19 || hbase || /opt/hbase || 
     20 || 網頁根目錄 || /var/www/ || 
     21 || hbase 的php碼目錄 || /var/www/hbase || 
     22 || thrift php || /var/www/hbase/thrift || 
    1823
    1924 * 測試程式之前,請先確定
     
    4348?>
    4449........
    45 其他程式碼
     50其他html 碼
     51<?
     52或是 下面提到的各式讀寫操作
     53
     54?>
    4655.......
    4756<?
     
    5059}}}
    5160
    52 
    53 
     61 * 所有的程式碼都必須包含這些引入函式庫、開啟關閉socket 的敘述
     62
     63 = 二、各種對hbase的操作 = 
     64
     65 == 2.1 列出hbase 裡的所有 table ==
     66{{{
     67!#php
     68echo( "listing tables...\n" );
     69$tables = $client->getTableNames();
     70sort( $tables );
     71foreach ( $tables as $name ) {
     72  echo( "  found: {$name}\n" );
     73}
     74}
     75}}}
     76 == 2.2 刪除table ==
     77{{{
     78!#php
     79$name = "hbase table name";
     80if ($client->isTableEnabled( $name )) {
     81      echo( "    disabling table: {$name}\n");
     82      $client->disableTable( $name );
     83}
     84echo( "    deleting table: {$name}\n" );
     85    $client->deleteTable( $name );
     86}
     87}}}
     88 == 2.3 新增table ==
     89
     90 * 我們先定義columns 的物件結構如下
     91{{{
     92!#php
     93$columns = array(
     94  new ColumnDescriptor( array(
     95    'name' => 'entry:',
     96    'maxVersions' => 10
     97  ) ),
     98  new ColumnDescriptor( array(
     99    'name' => 'unused:'
     100  ) )
     101);
     102}}}
     103
     104 * 將剛剛的column 放到table 內
     105{{{
     106!#php
     107$t = "table name";
     108echo( "creating table: {$t}\n" );
     109
     110try {
     111  $client->createTable( $t, $columns );
     112} catch ( AlreadyExists $ae ) {
     113  echo( "WARN: {$ae->message}\n" );
     114}
     115
     116}}}
     117 == 2.4 列出 table內的家族成員 family ==
     118{{{
     119!#php
     120$t = "table name";
     121echo( "column families in {$t}:\n" );
     122
     123$descriptors = $client->getColumnDescriptors( $t );
     124asort( $descriptors );
     125foreach ( $descriptors as $col ) {
     126  echo( "  column: {$col->name}, maxVer: {$col->maxVersions}\n" );
     127}
     128}}}
     129 == 2.5 寫入資料 ==
     130{{{
     131!#php
     132$t = "table name";
     133$row = "row name"
     134$valid = "foobar-\xE7\x94\x9F\xE3\x83\x93";
     135
     136$mutations = array(
     137  new Mutation( array(
     138    'column' => 'entry:foo',
     139    'value' => $valid
     140  ) ),
     141);
     142
     143$client->mutateRow( $t, $row, $mutations );
     144}}}
     145
     146 == 2.6 讀取資料 ==
     147 === get  取得一個 column value ===
     148 * get  取得一個 column value 的用法
     149
     150$table_name = 't1';
     151$row_name = '1';
     152$fam_col_name = 'f1:c1';
     153
     154        $arr = $client->get($table_name, $row_name , $fam_col_name);
     155        // $arr = array
     156        foreach ( $arr as $k=>$v  ) {
     157                // $k = TCell
     158                echo ("value = {$v->value} , <br>  ");
     159                echo ("timestamp = {$v->timestamp}  <br>");
     160        }
     161}
     162
     163 ===  getRow 取得一整個row ===
     164 * getRow($tableName, $row) 用法
     165{{{
     166#!php
     167$table_name = "table name";
     168$row_name = "row name";
     169
     170$arr = $client->getRow($table_name, $row_name);
     171// $client->getRow return a array
     172foreach ( $arr as $k=>$TRowResult  ) {
     173                // $k = 0 ; non-use
     174                // $TRowResult = TRowResult
     175                printTRowResult($TRowResult);
     176}
     177}}}
     178
     179 ===  scan 一整個table ===
     180
     181{{{
     182!#php
     183$table_name = 't1';
     184$start_row = ""; // 從row 的起點開始
     185$family = array( "f1","f2","f3" );
     186
     187
     188$scanner = $client->scannerOpen( $table_name, $start_row , $family );
     189// $scanner 是一個遞增數字 for open socket
     190// scannerGet() 一次只抓一row,因此要用while迴圈不斷地抓
     191while (true ){
     192                $get_arr = $client->scannerGet( $scanner );
     193                // get_arr is an array
     194
     195                if($get_arr == null) break;
     196                // 沒有回傳值代表已經沒有資料可抓,跳脫此無限迴圈
     197
     198                foreach ( $get_arr as $TRowResult ){
     199                        // $TRowResult = TRowResult
     200                        echo (" row = {$TRowResult->row} ; <br> ");
     201                        $column = $TRowResult->columns;
     202                        foreach ($column as $family_column=>$Tcell){
     203                                        echo ("family:column = $family_column ");
     204                                        // $family_column = family_column
     205                                        // $Tcell = Tcell
     206                                        echo (" value = {$Tcell->value} ");
     207                                        echo (" timestamp = {$Tcell->timestamp}  <br>");
     208                        }
     209                }
     210}
     211echo( "<br> ----------------- " );
     212echo( "<br> Scanner finished <br>" );
     213$client->scannerClose( $scanner );
     214
     215}}}