使用正则表达式提取配置单元计数字符串

时间:2019-06-17 12:15:22

标签: regex hive beeline

我正在尝试使用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()))

我能够检索计数并进行打印。只是寻找正则表达式以提取计数。

2 个答案:

答案 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的更多详细信息。