当前位置: 首页 / 技术干货 / 正文
Python如何操作Hive?

2023-02-23

   需要 self

Python如何操作Hive

  Python是一个非常优秀的编程语言,使用的群体非常的多,第三方的库也非常的多。其中有一个库叫做:PyHive,作用就是:连接到Hive,使用Python语言来操作Hive的数据!

  PyHive是通过HiveServer2服务连接到原数据库的,因此需要启动HiveServer2服务!

  启动HiveServer2服务

  # 直接开启HiveServer2的服务,但是需要注意这个进程是一个前台进程

  hive --service hiveserver2

  # 启动HiveServer2的服务,并将其设为后台进程,但是依然会在控制台输出一些日志信息

  hive --service hiveserver2 &

  # 启动HiveServer2的服务,并将其设为后台进程,将日志输出在指定的文件中

  hive --service hiveserver2 > /tmp/my_hive_logs/hiveserver2.log 2>&1 &

  需要注意:

  HiveServer2服务的完全启动需要一定的时间,追踪日志文件会发现最后在启动SESSION_ID,当启动到4个SESSION_ID的时候,服务才算完全启动,此时才可以使用beeline或者PyHive连接到Hive的元数据。这个过程需要1分钟左右。

  安装依赖

  我们需要使用Python代码来操作Hive,就需要安装好对应的库文件。直接使用pip命令来安装即可。那么安装在什么位置呢?主机还是虚拟机呢?

  在哪里执行代码,就在哪里安装!

  ●你的Python代码需要在windows本地运行,那就需要在windows上安装;

  ●你的Python代码需要在macOS本地运行,那就需要在macOS上安装;

  ●你的Python代码需要在CentOS虚拟机中运行,那就需要在CentOS虚拟机上安装

  # 使用pip3安装第三方库文件

  pip3 install pyhive sasl thrift thrift-sasl

  注意事项:

  在CentOS中,安装sasl的时候可能会失败,是因为缺少依赖文件,直接使用yum安装即可。

  yum install gcc gcc-c++ cyrus-sasl-devel

  基本的访问代码

  # @Author : 大数据章鱼哥

  # @Company : 北京千锋互联科技有限公司

  # 导入第三方模块

  from pyhive import hive

  # 创建程序与Hive的连接对象

  hive_connection = hive.Connection(

  host="192.168.10.101", # 开启了HiveServer2服务的节点IP地址或者主机名

  port=10000, # 连接到HiveServer2服务的端口,默认是10000端口

  username="root", # 连接到HiveServer2服务的用户名

  database="mydb" # 连接到Hive的数据库名字

  )

  # 创建游标对象

  hive_cursor = hive_connection.cursor()

  # 执行HQL语句

  hive_cursor.execute("select * from emp")

  # 获取所有的执行结果

  result = hive_cursor.fetchall()

  for row in result:

  print(row)

  # 释放资源

  hive_cursor.close()

  hive_connection.close()

  使用PyHive操作Hive的过程,其实与Python操作MySQL数据库非常的类似!

  当然,在上述的代码执行过程中,有可能会因为中间的代码出现异常,导致最终的资源无法释放的问题,因此我们可以这样优化代码

  # @Author : 大数据章鱼哥

  # @Company : 北京千锋互联科技有限公司

  # 导入第三方模块

  from pyhive import hive

  # 创建程序与Hive的连接对象

  hive_connection = hive.Connection(

  host="192.168.10.101", # 开启了HiveServer2服务的节点IP地址或者主机名(如果设置为主机名,需要保证已经做好映射)

  port=10000, # 连接到HiveServer2服务的端口,默认是10000端口

  username="root", # 连接到HiveServer2服务的用户名

  database="mydb" # 连接到Hive的数据库名字

  )

  # 创建游标对象,同时使用with代码段,完成资源的自动释放

  with hive_connection, hive_connection.cursor() as hive_cursor:

  # 执行HQL语句

  hive_cursor.execute("select * from mydb")

  # 输出查询到的所有结果

  rows = hive_cursor.fetchall()

  for row in rows:

  print(row)

  功能封装

  我们可以封装一个类,专门用来做与Hive的交互操作。我们在使用的时候,只需要将需要执行的HQL语句告诉这个类的对象即可。

  # @Author : 大数据章鱼哥

  # @Company : 北京千锋互联科技有限公司

  from pyhive import hive

  class HiveClient:

  __slots__ = ('db', 'cur')

  def __init__(self, *, host='192.168.10.101', port=10000, username='root', database='mydb'):

  """

  构造函数,提供默认的连接配置

  :param host: 连接到的服务器地址,默认 192.168.10.101

  :param port: 连接到的服务器端口,默认 10000

  :param username: 连接到的服务器用户,默认 root

  :param database: 连接到的数据库,默认 mydb

  """

  self.db = hive.Connection(host=host, port=port, username=username, database=database)

  self.cur = self.db.cursor()

  def __del__(self):

  """

  析构函数,用于释放连接对象

  :return:

  """

  self.cur.close()

  self.db.close()

  def execute(self, sql, params=None):

  """

  执行DDL、DML的操作

  :param sql: 需要执行的SQL语句

  :param params: 执行SQL语句时候的参数

  :return:

  """

  try:

  self.cur.execute(sql, params)

  self.db.commit()

  print("execute: ", sql, params)

  except Exception as e:

  print(e)

  self.db.rollback()

  def query_all(self, sql):

  """

  执行指定的查询语句,并返回所有的查询结果

  :param sql: 需要执行的查询操作

  :return: 查询到的所有结果

  """

  self.cur.execute(sql)

  return self.cur.fetchall()

  封装完成之后,后面再使用到Python来操作Hive的时候将会非常的方便

  # 实例化连接到操作Hive的对象

  client = HiveClient()

  # 加载数据,如果要使用local的路径,需要注意的是这里指的是连接到的hiveserver2所在节点的文件系统

  # client.execute("load data local inpath '/root/example_01_data' into table example_01")

  # 克隆表

  # client.execute("create table example_01_copy as select * from example_01")

  # 删除表

  # client.execute("drop table example_01_copy")

  # print(client.query_all("select * from example_01"))

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号