我正在尝试使用paramiko获取配置单元表中的记录总数。我知道我们可以使用Pyhive或pyhs2,但是它需要进行某些配置,并且需要很多时间才能从我的IT团队那里完成。
所以我正在使用paramiko执行以下命令并获取计数:
beeline -u jdbc:hive2://localhost:10000 -n hive -e 'select count(*) from table_name'
我得到以下结果,
+----------+--+
| _c0 |
+----------+--+
| 1232322 |
+----------+--+
我需要从输出中提取此计数。
我尝试了以下代码和RE,但无法正常工作
pattern="""
+----------+--+
| _c0 |
+----------+--+
| [0-9]* |
+----------+--+
"""
import paramiko
si, so, se=ssh_con.exec_command("beeline -u jdbc:hive2://localhost:10000 -n hive -e 'select count(*) from table_name'")
print(so.read().decode())
print(re.match(pattern,so.read().decode()))
我能够检索计数并进行打印。只是寻找正则表达式以提取计数。
答案 0 :(得分:1)
您的意思是匹配整个字符串,只提取表名下方的数字。
这里是一个正则表达式,可以解决您的问题:
^\+-+\+--\+\n\| *\w+ *\|\n\+-+\+--\+\n\| *(\d+) *\|\n\+-+\+--\+$
请参见regex demo。 \w+
匹配一个或多个单词字符,并匹配任何表名。
但是,您似乎只需要一个正则表达式来匹配| ... |
之间的数字即可。
使用
result = ''
m = re.search(r'\|\s*(\d+)\s*\|', so.read().decode())
if m:
result = m.group(1)
请参见this regex demo。
详细信息
\|
-一个|
字符\s*
-超过0个空格(\d+)
-第1组:一个或多个数字\s*\|
-0 +空格和一个|
字符。答案 1 :(得分:1)
在Beeline中,结果可以不同的格式显示。默认情况下,结果将打印在带有标题的表中。您可以删除标头和表,而无需使用regexp解析结果。添加以下选项:--showHeader=false
--outputformat=tsv2
beeline --showHeader=false --outputformat=tsv2 -u jdbc:hive2://localhost:10000 -n hive -e 'select count(*) from table_name'
阅读有关Output Formats的更多详细信息。