python3在操作hive的时候,可以采用pyhive的lib,在很多情况下,由于hive的单个表中的数据量比较多,因此在这种情况下,我们需要每次从hive中读取一部分数据,先处理完,然后再次的读取下一部分数据,针对这种情况,pyhive也提供了对应的方法给我们处理,以下是一个对应的例子:
#coding:utf-8
import os
import sys
from pyhive import hive
field_sep_token = b'\x7C\x1C'
def main():
host = 'xxxx'
port = 10000
username = 'hive'
password = 'xxx'
dbname = 'default'
auth = 'LDAP'
conn = hive.Connection(host=host, port=port,username=username,password=password,auth=auth,database=dbname)
cursor = conn.cursor()
cursor.execute('select * from schema.table')
fdata = open('a.dat', 'wb+')
num = 0
while True:
num += 1
data = cursor.fetchmany(size = 10)
if len(data) == 0:
break
for rows in data:
temp = []
for d in rows:
temp.append(str(d).encode('utf-8'))
temp.append(b'\n')
line = field_sep_token.join(temp)
fdata.write(line)
fdata.close()
if __name__ == '__main__':
main()
如上所示,可以看到将表中的数据下载下来,然后存储到.dat文件当中,但是可能会出现hive对应表中的数据数据比较多,如果一次性读取到内存的话,可能会导致内存溢出的问题,因此可以每次读取指定数量的数据,如1000条数据,将这1000条数据写入到文件当中,然后再去读取数据,直至读取完数据为止,这里采用了pyhive中fetchmany()的方法,其中有一个size的参数,表示一次性读取指定量的数据到内存,处理完之后再读取下一部分的数据到内存中;这里需要注意的是,fetchmany的方法返回的是一个数组类型,数组中的每一行数据是一个元组,如果没有数据的话,返回的是一个空的数组,而不是None;