python操作hive實戰

python操作hive實戰

來自專欄 Python程序員9 人贊了文章

最近需要用到hive,剛開始用py3去連接,白忙活了2天,居然沒有搞定,如果你搞定了,請分析筆記給我哈。我用py2搞定了,下面是步驟:

一、安裝

### 安裝PIP ###

curl bootstrap.pypa.io/get-p -o get-pip.py

python get-pip.py

# 查看 pip 版本 #

pip -V

#### install 依賴包 ####

yum install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi

如果 cyrus-sasl-plain 安裝失敗,則下載rpm包後進行安裝:

download.csdn.net/detai

rpm -ivh ./xxxxx.rpm

###安裝工程依賴包 ###

pip install -r requirements.txt

requirements.txt 文件內容如下:

pyhs2requests

二、代碼

#!/usr/bin/python2.7# -*- coding: UTF-8 -*- 代碼運行在python 2.7 環境,需要安裝import pyhs2import sysfrom logger.log import dblogclass HiveModelClass(object): def __init__(self, **connect_info): super(HiveModelClass, self).__init__() domain = connect_info[domain] # xx.cn host = connect_info[host] port = connect_info[port] if connect_info[port] else 10000 user = connect_info[user] password = connect_info[password] database = connect_info[database] if connect_info[database] else default try: conn = pyhs2.connect(host=host, port=port, authMechanism="LDAP", user={0}@{1}.format(user, domain), password=password, database=database) self.cursor = conn.cursor() except Exception as e: dblog.error(Catch exception: [ %s ], file: [ %s ], line: [ %s ]. % (e, __file__, sys._getframe().f_lineno)) self.cursor = None def _cursorQuery(self, sql): try: self.cursor.execute(sql) return self.cursor.fetchall() except Exception as e: dblog.error("[ERROR] Query error, Catch exception:[ %s ], file: [ %s ], line: [ %s ]" % (e, __file__, sys._getframe().f_lineno)) return # 插入介面 ## def _cursorInsert(self, sql): try: self.cursor.execute(sql) return 1 except Exception as e: dblog.error("[ERROR] Insert error, Catch exception:[ %s ], file: [ %s ], line: [ %s ]" % (e, __file__, sys._getframe().f_lineno)) return -1

有了hive 連接的基類,就可以針對這個基類新建一類繼承他,如下:

#!/usr/bin/python# -*- coding: UTF-8 -*-from Model.hiveModelClass import HiveModelClassfrom logger.log import dblogimport sysclass DefaultModelClass(HiveModelClass): def __init__(self): connect_dic = { domain: xx.cn, host: x.x.x.x, port: 10000, user: xxxxxx, password: xxxxxx, } super(DefaultModelClass, self).__init__(**connect_dic) def getCountData(self): 獲取數據的總行數 :return: number sql = select count(*) from test2 try: ret = self._cursorQuery(sql) return ret[0] except Exception as e: dblog.error("Catch exception: [ %s ], file: [ %s ], line: [ %s ]" % (e, __file__, sys._getframe().f_lineno)) return []

於是在控制器中初始化Default 對象,調用 getCountData 方法即可返回數據。 getCountData只是示列,其他方法等你開發。

dblog 是日誌模塊,可以用print替代(dblog.error/dblog.info 等替換為print)

hive查詢起來還是很慢的,優勢在於大量數據查詢或者處理。


推薦閱讀:

Day6-1,函數,匿名函數,偏函數
關於Python中字元串前綴的說明
上下文管理器-1.基本概念及其實現
python基礎-循環(for)
Python 多進程及進程間通信

TAG:Hadoop | Python | Spark |