Hive使用表生成函数(UDTF)实现列拆分,一行变多行

大数据 TIAN 502℃ 0评论

做DNS日志分析,日志离线存在Hive表里,有两个字段叫qdomain和value。其中域名可以添加多条A记录用于DNS轮询,所以value字段就会有多个IP。捕包程序解析DNS报文后,将RRset合并到一起存储。格式是这样子的:

字段之间以逗号隔开,value中的IP以分号隔开。

但是如果做PDNS的话要把RRset拆开,方便做firstseen,lastseen和count。运算环境基于Spark,所以有一个需求就是拆分列,一行变多行才行。就像这样:

查了下资料,也问了下人,解决方案就是在查Hive的时候使用表生成函数(UDTF)实现列的拆分。

什么是表生成函数?

表生成函数就是与聚合函数“相反的”一类函数,它可以将单列扩展成多列或者多行。其中Hive有一个表生成函数explode(),可以以array类型数据作为输入,然后对数组中的数据进行迭代,返回多行结果,举个栗子:

但是UDTF在select语句中不能有其他表达式,不过Hive提供了一个LATERAL VIEW的功能来实现这种查询。

另外本例中qdomain和value字段都是string类型的,所以还要先对value字段进行切分。转化SQL为:

其中cdns是数据库名,r2c是表名,t是视图别名,ip是新列列名。就完事了~

转载请注明:老田博客 » Hive使用表生成函数(UDTF)实现列拆分,一行变多行

喜欢 (4)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. AND、OR运算符需要同时使用时,一定要注意运算符的优先级。SQL在处理操作时会优先处理and操作。
    TIAN2018-05-04 13:16 回复