使用python自动化Hive

时间:2015-04-29 08:21:46

标签: python python-2.7 hadoop hive

我正在运行配置单元0.12,我想运行几个查询并将结果作为python数组返回。

例如:

result=[]
for col in columns:
  sql='select {c} as cat,count(*) as cnt from {t} group by {c} having cnt > 100;'.format(t=table,c=col)
  result.append(hive.query(sql))
result=dict(result)

我缺少的是运行SQL查询的hive类。

如何做到这一点?

3 个答案:

答案 0 :(得分:2)

一种快速而又脏的方法是从命令行自动化配置单元

hive -e "sql command"

这样的事情应该有效

def query(self,cmd):
    """Run a hive expression"""
    cmd='hive -e "'+cmd+'"';
    prc = subprocess.Popen(cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    ret=stdout.split('\n')
    ret=[r for r in ret if len(r)]
    if (len(ret)==0):
         return []
    if (ret[0].find('\t')>0):
         return [[t.strip() for t in r.split('\t')] for r in ret]
    return ret

答案 1 :(得分:1)

另一种方法是使用pyhs2库在Python进程中本地打开与Hive的连接。以下是我拼凑在一起测试不同用例的一些示例代码,但它应该有希望说明这个库的使用。

# Python 2.7
import pyhs2
from pyhs2.error import Pyhs2Exception

hql = "SELECT * FROM my_table"
with pyhs2.connect(
  host='localhost', port=10000, authMechanism="PLAIN", user="root" database="default"
  # Use your own credentials and connection info here of course
) as db:
  with db.cursor() as cursor:

    try:
      print "Trying default database"
      cursor.execute(hql)
      for row in cursor.fetch(): print row
    except Pyhs2Exception as error:
      print(str(error))

根据您的盒子上已安装或未安装的内容,您可能还需要安装libpythonlibsasl2的开发标题。

答案 2 :(得分:1)

您还可以使用Thrift访问Hive。 https://cwiki.apache.org/confluence/display/Hive/HiveClient#HiveClient-Python。看起来pyhs2主要是直接使用Thrift的包装器。