提取密钥:Hive中列字段的值

时间:2015-02-22 14:13:03

标签: mysql sql regex hadoop hive

我目前正在学习/测试Hive,但似乎找不到合适的解决方案来解决这个问题: 我有这样的日志文件:

IP, Date, Time, URL, Useragent

我目前在这些列的表中。这些列由' \ t'分隔。但是 URL 已经获得了一些特定的客户信息,如下所示:

example.org/log.gif?userID=xxx&sex=m&age=y&subscriber=y&lastlogin=ddd

我想创建一个包含这些给定值对的新表:userID, sex, age, subscriber, lastlogin另一个问题是值对并不总是完整,或者有些丢失。像这样:

example.org/log.gif?userID=xxx&sex=m&age=y&subscriber=y&lastlogin=ddd

example.org/log.gif?userID=xxx&sex=m&age=y&lastlogin=

这使得Hive的... format delimited fields terminated by '&'; afaik在这种情况下无用,因为它会导致列中的值不正确。

有没有办法在Hive中使用SQL和正则表达式来解决这个问题?

1 个答案:

答案 0 :(得分:0)

虽然有两个Hive表,但可以这样做。首先使用以下列将数据加载到一个表中:

IP, Date, Time, URL, Useragent

在这里,我建议使用EXTERNAL Hive表 - 您没有解析数据,并且此Hive表不需要存在很长时间,因此只需将Hive元数据置于其上:

CREATE EXTERNAL TABLE raw_log (
  ip                string,
  date              string,
  time              string,
  url               string,
  useragent         string
)
LOCATION '<hdfs_location_of_the_raw_log_folder>';

然后使用带有Hive INSERT INTO方法的regexp_extract(string subject, string pattern, int index)查询(请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)将其加载到包含正确列的“final”表中。

您还可以编写自己的UDF,这样可以更好地处理您提到的不完整/缺失值,尽管每次输入数据的格式都必须重新编译并重新部署JAR。变化(见https://cwiki.apache.org/confluence/display/Hive/HivePlugins)。