利用pyhive将hive查询数据导入到mysql

在大数据工作中经常碰到需要将hive查询数据导入到mysql的需求,常见的方法主要有两种,一是sqoop,另一种则是pyhive。本文主要讲的就是python的pyhive库的安装与使用。

pyhive作用

  • 远程连接hive数据库,运行hive sql,而不需要登录到安装有hive的服务器上去
  • 可以更方便处理更多连续命令,可以封装一些经常需要复用的命令
  • 脚本化,不需要编译,随时改,随时执行看结果
  • 方便对hive sql的结果进行更多处理,而不是仅仅在终端打印出来看一看

安装环境

这里只讲解Linux环境,以ubuntu为例,其他系统类似

  • python 环境,我装的是python2 apt-get install python2.7
  • apt-get install python-dev
  • apt-get install libsasl2-dev
  • pip install sasl
  • pip install thrift-sasl
  • pip install PyHive

    注意不要漏装,否则报错,另外如果使用python3,则安装包的名字可能不一样,比如python3-dev

用法

连接hive数据库

conn=hive.Connection(host='xxx.xxx.xxx.xxx',   port=10000, database='database name', auth='NOSASL' )
cursor = conn.cursor()
cursor.execute(sql)
res = cursor.fetchall()  或者  res = cursor.fetchone()
cursor.close()
conn.close()

host是hive所在服务器ip,端口一般是10000,但具体是多少需要看配置来确定,配置所在位置为 hive目录/conf/hive-site.xml 其中的配置项 hive.server2.thrift.port 即为端口号。 sql就是 hive sql语句。

实例应用

场景

查询hive数据库,并将结果写入到mysql中

分析

  • 直接用hive sql肯定是不行的,因为结果要导入到mysql中,而不是打印看看或者保存到文本
  • sqoop可以,但sqoop的主要功能是把hive 的数据导入到mysql,而不能执行hive查询命令。换句话说,需要先另建一个hive表,先用hivesql查询,把结果保存在这个表中,然后用sqoop导到mysql中。
  • pyhive则可以执行hivesql,而且基于python,所以脚本里肯定也可以操作mysql数据库,即可以写入mysql
  • 如果查询得到的数据量比较大,那么建议使用sqoop,哪怕步骤可能会麻烦一点,但总体上是节约时间的,因为它从hive到mysql的导入是封装好的,应该比我们自己写insert sql要快。
  • 但是pyhive更方便,更灵活,更容易应对捞数据的需求。

python 源码如下:

#!/usr/bin/env python

import sys
from pyhive import hive
import MySQLdb

class HiveClient:

    def __init__(self, db_host, hdatabase, hport=10000):
        """
        create connection to hive server
        """
        self.conn = hive.Connection(host=db_host,   port=hport,  database=hdatabase)

    def query(self, sql):
        """
        query
        """
        cursor = self.conn.cursor()
        cursor.execute(sql)
        res = cursor.fetchall()
        cursor.close()
        return res

    def close(self):
        """
        close connection
        """
        self.conn.close()


class MysqlClient:
    def __init__(self, mdb):
        self.conn = MySQLdb.connect (host = "rm-xxx.mysql.rds.aliyuncs.com",   user = "xxx",  passwd = "xxx",  db = mdb)
    def insert(self,sql):
        cursor = self.conn.cursor()
        cursor.execute(sql)
        cursor.close ()
        self.conn.commit()

    def close(self):
        self.conn.close ()

def dhive():
    try:
        hcon = HiveClient('127.0.0.1', 'db_name', '20000' )
        mcon = MysqlClient('a_db_name')
        res = hcon.query("select name, accountid from a_table_name where length(name)>10 ")
        hcon.close()
        for item in res:
            sql = """ insert ignore into b_table_name (name, accid) value( '%s', %s) """%( item[0], item[1])
            mcon.insert(sql)
        mcon.close()

    except Exception, tx:
        print 'excepion %s' % (tx.message)

if __name__ == "__main__":
    dhive()

可以看出,将hive连接封装后,调用会变得非常方便,以后复用也很方便。

你可能感兴趣的:(python,linux,大数据)