欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php通过thrift开发hive

程序员文章站 2022-05-06 13:50:18
...

概述: 由于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()这三个函数,另外几个可以再试用一下。