我正在使用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等。
任何想法都值得赞赏。
答案 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将使用字母数字和特殊字符'-'提取域根。
希望这会有所帮助。