我目前正在学习/测试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和正则表达式来解决这个问题?
答案 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)。