php通过thrift开发hive
概述: 由于hadoop和hive都是用java写的,要使用像php这样的脚本语言(实际上thrift支持的语言还有很多,大部分主流语言都包括)对hive进行开发就需要一个跨语言的连接桥梁,到目前为止,我所知道的有两种方法可以实现: 1.后面将具体说明的Thrift Thrift是F
概述:
由于hadoop和hive都是用java写的,要使用像php这样的脚本语言(实际上thrift支持的语言还有很多,大部分主流语言都包括)对hive进行开发就需要一个跨语言的连接桥梁,到目前为止,我所知道的有两种方法可以实现:
1.后面将具体说明的Thrift
Thrift是Facebook的一个开源项目,同时也是hadoop和hive官网上提到一种中间件,本次开发就是使用Thrift
2.php java bridge(这个没有用过,不太了解)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面主要总结一些thrift相关的东西
安装:
在安装好hadoop,hive并且以mysql作为hive的元数据库配置完成的前提下
1.下载thrift(apache thrift官网)
2.解压:tar -zxvf 压缩包名
3.安装依赖库:libevent和libevent-devel
4.在thrift路径下执行:./configure【具体见./configure --help】;然后make & make install
具体说明可以查看官网信息:http://thrift.apache.org/
使用:
thrift目录下有packages、protocol、server、transport几个文件夹,并且提供了以下几个操作hive的函数:
interface ThriftHiveIf extends ThriftHiveMetastoreIf { public function execute($query);//执行$query public function fetchOne();//获取一条结果 public function fetchN($numRows);//获取$numRows条结果 public function fetchAll();//获取所有结果 public function getSchema();//获取元数据 public function getThriftSchema();//没试过 public function getClusterStatus();//获取集群状态 public function getQueryPlan();//获取执行计划 }
调用的时候在php文件加上以下内容:
$GLOBALS['THRIFT_ROOT'] = 'Thrift/'; //thrift根目录 // load the required files for connecting to Hive require_once $GLOBALS['THRIFT_ROOT'] . 'packages/hive_service/ThriftHive.php'; require_once $GLOBALS['THRIFT_ROOT'] . 'transport/TSocket.php'; require_once $GLOBALS['THRIFT_ROOT'] . 'protocol/TBinaryProtocol.php'; // Set up the transport/protocol/client $transport = new TSocket(host_ip, 10000); $protocol = new TBinaryProtocol($transport); $client = new ThriftHiveClient($protocol); $transport->open();之后就是通过$client来执行hql语句,举几个例子:
1.获取数据库:
$client->execute("show databases"); $result = $client->fetchAll();//$result接收执行结果说明:也就是将要执行的hql作为execute()函数的参数,并用fetchAll()函数获取结果;
2.获取元数据:
要获取hive的元数据是通过getSchema()函数,它是要配合某一个查询的执行进行获取,例子如下:
$client->execute("select id from hivetest");//hivetest表中只有id、name两个字段分别为int和string类型 $schema = $client->getSchema(); $result = $client->fetchAll();
打印的$schema的值为:
metastore_Schema Object (
[fieldSchemas] => Array (
[0] => metastore_FieldSchema Object (
[name] => id
[type] => int
[comment] => )
)
[properties] =>
)
要获取其中的数据可以通过下面这个函数对$schema 进行转化:
function objtoarr($obj){ $ret = array(); foreach($obj as $key =>$value){ if(gettype($value) == 'array' || gettype($value) == 'object'){ $ret[$key] = objtoarr($value); } else{ $ret[$key] = $value; } } return $ret; }主要用到execute()、fetchaAll()、getSchema()这三个函数,另外几个可以再试用一下。