您的位置:首页 > 其它

如何将hive的执行结果返回给一个变量

2018-01-25 14:42 399 查看
首先可以将hive sql写入python脚本

假如有如下hive sql:

hive_cmd = 'hive -e "select count(*) from hbase.routermac_sort_10;"'

一般在python中按照如下方式执行该hive sql:

os.system(hive_cmd)

但是当我需要在程序中拿到count()的执行结果时,使用os.system()则无能为力,应该使用以下方式:

k = os.popen(hive_cmd).read()  

将hive_cmd的执行结果返回给变量k,k的值此时应该是个字符串。但是这里有个坑,此时的k的值可能并非你想要的结果,比如count(*)的结果是4693624,本来的想法是k应该等于4693624,可是事实并非如此;使用print(len(k))得到的结果是居然是12,按理来说字符串‘4693624’的长度应该是7,怎么会是12呢,然后print k会发现输出为:_c0+换行+4693624+换行,原来os.popen(hive_cmd).read()
 返回的是文件描述符,在这里k应该等于'_c0\n4693624\n'

所以想要拿到真正的执行结果则需要对字符串k进行截取:i = k[4:11],此时i = '4693624'

然后可以将i转换为int类型进行进一步的操作。我拿到count()的结果主要是为了对hbase表进行预分区,分区数为40,生成预分区所用split.txt文件过程如下:

i = int(k[4:11])

n = i/40

hive_cmd9 = 'hive -e "select routermac from %s where rank=%s or rank=%s*2 or rank=%s*3 or rank=%s*4 or rank=%s*5 or rank=%s*6 or rank=%s*7 or rank=%s*8 or rank=%s*9 or rank=%s*10 or rank=%s*11 or
rank=%s*12 or rank=%s*13 or rank=%s*14 or rank=%s*15 or rank=%s*16 or rank=%s*17 or rank=%s*18 or rank=%s*19 or rank=%s*20 or rank=%s*21 or rank=%s*22 or rank=%s*23 or rank=%s*24 or rank=%s*25 or rank=%s*26 or rank=%s*27 or rank=%s*28 or rank=%s*29 or rank=%s*30
or rank=%s*31 or rank=%s*32 or rank=%s*33 or rank=%s*34 or rank=%s*35 or rank=%s*36 or rank=%s*37 or rank=%s*38 or rank=%s*39;" >> ~/hbase/%s' % (newTableName,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,splitName)

run = os.system(hive_cmd9)

split_10.txt保存的则是预分区所需要要的39个rowkey
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐