HiveQL:解析字符串并计数

时间:2019-02-05 21:01:56

标签: regex hive hiveql

我正在使用HiveQL处理HDFS中存储的数百万行域名文本数据。以下是手动选择的子集,以说明词汇多样性。有重复的条目。

dnsvm.mgmtsubnet.mgmtvcn.oraclevcn.com.
mgmtsubnet.mgmtvcn.oraclevcn.com.
asdf.mgmtvcn.oraclevcn.com.
dnsvm.mgmtsubnet.mgmtvcn.oraclevcn.com.
localhost.
a.localhost.
img.pulsemgr.com.
36.136.154.156.in-addr.arpa.
accounts.spotify.com.
_dmarc.ixia-devops.com.
&eventtype=close&reason=4&duration=35.
&eventtype=close&reason=3&duration=10336.

我试图根据域的最后两个级别来获取行数,有时第二个级别不存在(即localhost.)。例如:

domain_root     count
oraclevcn.com.  4
localhost.      1
a.localhost.    1
pulsemgr.com.   1
in-addr.arpa.   1
spotify.com.    1
ixia-devops.com 1

也很高兴看到第二级的域名不存在。

我不确定从哪里开始。我已经看到了SPLIT()函数的使用,但是它可能并不健壮,因为域名可能有很多级别,例如:a.b.c.d.e.f.g.h.i等。

任何想法都值得赞赏。

1 个答案:

答案 0 :(得分:1)

下面是带有regexp_extract的查询。

select domain_root, count(*) from (select regexp_extract('dnsvm.mgmtsubnet.mgmtvcn.oraclevcn.com.', '[A-Za-z0-9-]+\.[A-Za-z0-9-]+\.$', 0) as domain_root from table) A group by A.domain_root -- replace first arguement with column name

regex将使用字母数字和特殊字符'-'提取域根。

希望这会有所帮助。