概述: 由于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(这个没有用过,不太了解)
立即学习“PHP免费学习笔记(深入)”;
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面主要总结一些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()这三个函数,另外几个可以再试用一下。











