php 通过 thrift-0.8.0 连接hbase 以及函数使用

1、参照上一篇博文,在安装好hbase后编译安装thrift-0.8.0

链接:blog.csdn.net/fffft017/article/details/42964903

2、PHP通过Thrift访问Hbase的库是在Thrift-0.8.0/lib/php/scr中,复制thrift-0.8.0/lib/php到相应php web目录下

3、用thrift生成php与hbase的接口文件

thrift --gen php /home/hadoop/hbase-0.98/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

(ps:根据Hbase.thrift所在的目录设置,如果之前下载的hbase是bin.tar.gz,需要到hbase官网上下载对应的src.tar.gz

笔者使用的是hbase-0.98.6.1

   

生成目录文件: /home/hadoop/gen-php/Hbase
    有文件: Hbase.php,Hbase_types.php
    把Hbase.php,Hbase_types.php copy到:web目录/php/src/packages/Hbase/

4、使用php脚本测试:

<?php  
  
ini_set('display_errors', E_ALL);  
$GLOBALS['THRIFT_ROOT'] = './php/src';  
  
require_once( $GLOBALS['THRIFT_ROOT'] . '/Thrift.php' );  
require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php' );  
require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TBufferedTransport.php' );  
require_once( $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php' );  
require_once( $GLOBALS['THRIFT_ROOT'] . '/packages/Hbase/Hbase.php' );  
  
$socket = new TSocket('10.64.60.83', '9090');  
  
$socket->setSendTimeout(10000); // Ten seconds (too long for production, but this is just a demo ;)  
$socket->setRecvTimeout(20000); // Twenty seconds  
$transport = new TBufferedTransport($socket);  
$protocol = new TBinaryProtocol($transport);  
$client = new HbaseClient($protocol);  
  
$transport->open();  
  
//获取表列表  
$tables = $client->getTableNames();  
sort($tables);  
foreach ($tables as $name) {  
  
    echo( "  found: {$name}\n" );  
}  
   
//创建新表student  
$columns = array(  
    new ColumnDescriptor(array(  
        'name' => 'id:',  
        'maxVersions' => 10  
    )),  
    new ColumnDescriptor(array(  
        'name' => 'name:'  
    )),  
    new ColumnDescriptor(array(  
        'name' => 'score:'  
    )),  
);  
  
$tableName = "student";  
try {  
    $client->createTable($tableName, $columns);  
} catch (AlreadyExists $ae) {  
    echo( "WARN: {$ae->message}\n" );  
}  
//获取表的描述  
  
$descriptors = $client->getColumnDescriptors($tableName);  
asort($descriptors);  
foreach ($descriptors as $col) {  
    echo( "  column: {$col->name}, maxVer: {$col->maxVersions}\n" );  
}  
  
//修改表列的数据  
$row = '2';  
$valid = "foobar-\xE7\x94\x9F\xE3\x83\x93";  
$mutations = array(  
    new Mutation(array(  
        'column' => 'score',  
        'value' => $valid  
    )),  
);  
$client->mutateRow($tableName, $row, $mutations);  
  
  
//获取表列的数据  
$row_name = '2';  
$fam_col_name = 'score';  
$arr = $client->get($tableName, $row_name, $fam_col_name);  
// $arr = array  
foreach ($arr as $k => $v) {  
// $k = TCell  
    echo ("value = {$v->value} , <br>  ");  
    echo ("timestamp = {$v->timestamp}  <br>");  
}  
  
$arr = $client->getRow($tableName, $row_name);  
// $client->getRow return a array  
foreach ($arr as $k => $TRowResult) {  
// $k = 0 ; non-use  
// $TRowResult = TRowResult  
    var_dump($TRowResult);  
}  
  
$transport->close();  
?>  

可查询到hbase中的表即说明php已经可以连接hbase了。


5、php操作hbase

转自:http://blog.vkap.com/?p=1627

//Hbase 操作记录[php thrift]
//scanscanner:一个对象,可以通过下列方法直接获得:


public function scannerOpen($tableName, $startRow, $columns);


public function scannerOpenWithStop($tableName, $startRow, $stopRow, $columns);


public function scannerOpenWithPrefix($tableName, $startAndPrefix, $columns);


public function scannerOpenTs($tableName, $startRow, $columns, $timestamp);


public function scannerOpenWithStopTs($tableName, $startRow, $stopRow, $columns, $timestamp);


 


//此时需要提供表名,开始行,结束行,开始行前缀,版本号等等条件。开始行和结束行为相同时可以定位到唯一一条,columns可以为空数组,开始行和结束行可以为不存在///的rowkey,比如我的表中rowkey结构是userid_timestamp,我就可以用userid_0和userid_9999999999这样的rowkey取得这个用户的所有数据。
//scanner也可以通过:


scannerOpenWithScan($tableName, $scan);


//方法获得,此时你需要自己new一个$scan对象,$scan是一个定义$startRow,$stopRow,$filter(过滤器)等的对象,此时你可以更灵活的使用$filter来扫描表,但是最好要//用$startRow,$stopRow限定范围,否则thrift很容易超时。


//例子:($hbase是一个hbase的连接对象)
$type = 0;


$filter ="SingleColumnValueFilter('m','type',=,'binary:{$type}')";


$scan = new TScan();


$scan->filterString=$filter;


$scan->startRow=$uid.'_0′;


$scan->stopRow=$uid.'_999999999′;


$scanner = $hbase->scannerOpenWithScan($this->tablename, $scan);


$get_arr = $hbase->scannerGetList($scanner,Config::MAXN_MSG);


$hbase->scannerClose($scanner);


//此处我用<span style="white-space:pre">	</span>$scan->startRow=$uid.'_0′;        $scan->stopRow=$uid.'_999999999′;    限定了扫描的范围,避免整表扫描
//注意事项:
//SingleColumnValueFilter过滤器在手册里的说明参数位置是错误的,正确的应该为:
//Syntax: SingleColumnValueFilter('<family>', '<qualifier>', <compare operator>, '<comparator>', '<filterIfColumnMissing_boolean>, <latest_version_boolean>)
//Syntax: SingleColumnValueFilter('<family>', '<qualifier>, <compare operator>, '<comparator>')
//Example: "SingleColumnValueFilter ('FamilyA', 'Column1', <=, 'abc','true, false)"
//Example: "SingleColumnValueFilter ('FamilyA', 'Column1', <=, 'abc')"


 


注意使用时<family>是不用带冒号的。
下面的方法是scanner对象的简化使用方法


public function get($tableName, $row, $column);


public function getVer($tableName, $row, $column, $numVersions);


public function getVerTs($tableName, $row, $column, $timestamp, $numVersions);


public function getRow($tableName, $row);


public function getRowWithColumns($tableName, $row, $columns);


public function getRowTs($tableName, $row, $timestamp);


public function getRowWithColumnsTs($tableName, $row, $columns, $timestamp);


public function getRows($tableName, $rows);


public function getRowsWithColumns($tableName, $rows, $columns);


public function getRowsTs($tableName, $rows, $timestamp);


public function getRowsWithColumnsTs($tableName, $rows, $columns, $timestamp);


下面是一些数据库操作方法:
public function showTable() {


$tables = $this->hbase->_dbh->getTableNames();


asort($tables);


foreach($tables as $name)        {


echo $name."<br>";


}


}


public function showColumnFamilies($tablename) {


echo("column families in {$tablename}:\n");


$descriptors = $this->hbase->_dbh->getColumnDescriptors($tablename);


asort($descriptors);


foreach($descriptors as $col)        {


echo("column:{$col->name},maxVer:{$col->maxVersions}<br>");


}


}


public function getallcolumn($uid)    {


$arr = $this->hbase->_dbh->getRow(self::user_table , $uid);


}
public function getallmessage($uid)    {


$columns = array ('column' => 'bhvr:');


$arr = $this->hbase->_dbh->getRowsWithColumns($t, array($uid), $columns);


echo '<pre>';        print_r($arr);


}


public function scan1($tableName)    {


$startRow = 13222120124960963;


$scan = $this->hbase->_dbh->scannerOpen($tableName, $startRow, $columns);


$nbRows = 1;


$arr = $this->hbase->_dbh->scannerGetList($scan, $nbRows);


var_dump('count of result :'.count($arr));


foreach ($arr as $k => $TRowResult) {


echo '<pre>';


print_r($TRowResult);


}


$this->hbase->_dbh->scannerClose($scan);


}


public function createTable($tablename,$columnFamilies)    {


foreach ($columnFamilies as $cf) {


$columns[] = new ColumnDescriptor(array('name' => $cf.':'));


}


echo("creating table: {$tablename}\n");


try        {


$this->hbase->_dbh->createTable( $tablename, $columns );


}        catch (AlreadyExists $ae)        {


echo( "WARN: {$ae->message}\n" );


}


}


public function delTable($tablename)    {


if($this->hbase->_dbh->isTableEnabled($tablename))        {


echo "关闭".$tablename."资料表\n";


$this->hbase->_dbh->disableTable($tablename);


}


echo "刪除中…\n";


$this->hbase->_dbh->deleteTable($tablename);


echo "刪除完成";


}

在使用过程中遇到不明白的函数,不清楚的返回类型就查看Hbase.php,Hbase_types.php。


感谢:

http://blog.csdn.net/hguisu/article/details/7298456



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Python中使用Thrift连接HBase,您需要按照以下步骤进行设置: 1. 安装所需的依赖项: 您需要安装`thrift`和`happybase`这两个Python库。可以使用以下命令进行安装: ```bash pip install thrift happybase ``` 2. 生成HBaseThrift代码: 使用Thrift工具生成HBaseThrift代码。您可以使用以下命令: ```bash thrift -r --gen py hbase.thrift ``` 这将生成Python的Thrift代码文件。 3. 创建HBase连接: 在Python脚本中,您需要首先创建一个HBase连接。示例代码如下: ```python import happybase connection = happybase.Connection(host='localhost', port=9090) ``` 4. 执行HBase操作: 在创建了HBase连接之后,您可以使用`connection`对象执行各种HBase操作,例如创建表、插入数据、获取数据等。以下是一些示例代码: - 创建表: ```python connection.create_table( 'mytable', { 'cf': dict(max_versions=10), } ) ``` - 插入数据: ```python table = connection.table('mytable') table.put( b'row1', { b'cf:col1': b'value1', b'cf:col2': b'value2', } ) ``` - 获取数据: ```python table = connection.table('mytable') row = table.row(b'row1') print(row) ``` - 删除数据: ```python table = connection.table('mytable') table.delete(b'row1') ``` 这只是一些示例代码,您可以根据需要使用其他HappyBase方法来执行更多操作。 5. 关闭连接: 当您完成HBase操作后,记得关闭连接以释放资源: ```python connection.close() ``` 请注意,为了成功执行这些操作,您需要确保HBase正在运行并且在指定的主机和端口上进行监听。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值