Python 中使用 pyhs2 連接 HiveServer 2 查詢數(shù)據(jù)

封裝一下 pyhs2廷区,讓其使用起來和 torndb 一樣簡單好用。
提供 db.query贾铝、db.get隙轻、db.execute 三個方法,用法和 torndb 完全一樣忌傻。
queryget 返回值數(shù)據(jù)類型也完全一樣; 惟一不同的是 execute 方法大脉,torndb 中會返回 lastrowid,本文中返回 None

完整代碼:https://github.com/Shu-Ji/pyhs2-torndb

# coding: u8

import pyhs2
from pyhs2.error import Pyhs2Exception


class Row(dict):
    """A dict that allows for object-like property access syntax."""
    def __getattr__(self, name):
        try:
            return self[name]
        except KeyError:
            raise AttributeError(name)


class Connection(object):
    def __init__(self, db_host, user, database, port=10000,
            authMechanism="PLAIN"):
        """
        create connection to hive server2
        """

        self.conn = pyhs2.connect(host=db_host,
                port=port,
                authMechanism=authMechanism,
                user=user,
                database=database,
                )

    def query(self, sql):
        """Returns a row list for the given query and parameters."""
        with self.conn.cursor() as cursor:
            self._execute(cursor, sql)
            column_names = [i['columnName'] for i in cursor.getSchema()]
            return [Row(zip(column_names, row)) for row in cursor]

    def _execute(self, cursor, sql):
        try:
            return cursor.execute(sql)
        except Pyhs2Exception as e:
            self.close()
            raise(e)

    def get(self, sql):
        """Returns the (singular) row returned by the given query.
        If the query has no results, returns None.  If it has
        more than one result, raises an exception.
        """

        rows = self.query(sql)
        if not rows:
            return None
        elif len(rows) > 1:
            raise Exception("Multiple rows returned for get() query")
        else:
            return rows[0]

    def execute(self, sql):
        """Executes the given query, returning None."""

        with self.conn.cursor() as cursor:
            self._execute(cursor, sql)

    def close(self):
        if hasattr(self, 'conn'):
            self.conn.close()

    def __del__(self):
        self.close()


def test_query(db):
    sql = """
    SELECT platform, dt
    FROM  mydb.pv_log
    WHERE dt='20170827'
    LIMIT 3
    """
    rows = db.query(sql)
    for row in rows:
        print(row)


def test_get(db):
    # get() should only return one row, else will raise an error
    sql = """
    SELECT platform, dt
    FROM  mydb.pv_log
    WHERE dt='20170829'
    LIMIT 1
    """
    row = db.get(sql)
    print(row)
    # row is an dict-like object
    print(row.dt)
    print(row['dt'])


def test_execute(db):
    # `UPDATE` or `DELETE` is DANGER!!!
    # sql = """
    # UPDATE xxx
    # """
    # db.execute(sql)
    pass


def main():
    host = '127.0.0.1'
    db = Connection(db_host=host, port=10000, user='myuser',
            database='mydb', authMechanism='PLAIN')

    test_query(db)
    test_get(db)
    test_execute(db)


if __name__ == '__main__':
    main()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末水孩,一起剝皮案震驚了整個濱河市镰矿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俘种,老刑警劉巖秤标,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宙刘,居然都是意外死亡苍姜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門悬包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衙猪,“玉大人,你說我怎么就攤上這事布近〉媸停” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵撑瞧,是天一觀的道長棵譬。 經(jīng)常有香客問我,道長预伺,這世上最難降的妖魔是什么订咸? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任曼尊,我火速辦了婚禮,結(jié)果婚禮上脏嚷,老公的妹妹穿的比我還像新娘骆撇。我一直安慰自己,他們只是感情好然眼,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布艾船。 她就那樣靜靜地躺著,像睡著了一般高每。 火紅的嫁衣襯著肌膚如雪屿岂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天鲸匿,我揣著相機與錄音爷怀,去河邊找鬼。 笑死带欢,一個胖子當著我的面吹牛运授,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乔煞,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吁朦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渡贾?” 一聲冷哼從身側(cè)響起逗宜,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎空骚,沒想到半個月后纺讲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡囤屹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年熬甚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肋坚。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乡括,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出智厌,到底是詐尸還是另有隱情粟判,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布峦剔,位于F島的核電站,受9級特大地震影響角钩,放射性物質(zhì)發(fā)生泄漏吝沫。R本人自食惡果不足惜呻澜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惨险。 院中可真熱鬧羹幸,春花似錦、人聲如沸辫愉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恭朗。三九已至屏镊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痰腮,已是汗流浹背而芥。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留膀值,地道東北人棍丐。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像沧踏,于是被迫代替她去往敵國和親歌逢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容