如何将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
假如有如下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
相关文章推荐
- C++中,如何执行一个控制台命令并返回结果到字符串string中
- 在.bat脚本中如何将一个命令的返回结果传给一个变量?
- 一个主线程下有多个子线程任务,主线程必须在100秒内将子线程执行的集合结果进行处理返回
- (SQL)如何将exec执行结果放入外面的变量中--动态sql
- (SQL)如何将exec执行结果放入外面的变量中--动态sql语句
- 2.6 编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- 如何将exec执行结果放入变量中
- 如何让SQL语句不执行默认排序,而是按照in语句的顺序返回结果
- Java里如何实现一个方法在不同情况下“返回”不同的类型变量?
- [MSSQL]如何将exec执行结果放入外面的变量中
- SQL中如何才能将查询的结果数据存在一个变量中???
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- python 写一个Mythread能返回线程执行的结果
- 如何将exec执行结果放入变量中
- SqlQueryToList 执行SQL语句并把结果返回成一个List<dynamic>
- 【python+mysql】mysql语句的执行,结果捕获,及如何在mysql语句中包含变量
- Hive0.7.1中CompactIndex的实现---一个Hive的MapredTask如何执行
- 如何封装一个数据库查询,并把结果返回给调用者
- jquery中的ajax如何返回结果而非回调方式即为同顺序执行
- 练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。