Mysql 从配置单元中的列字段提取键:值
我目前正在学习/测试Hive,似乎找不到解决此问题的合适方法: 我的日志文件如下所示:Mysql 从配置单元中的列字段提取键:值,mysql,sql,regex,hadoop,hive,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、lastlogi
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的。。。格式化以“&”结尾的分隔字段在这种情况下,code>afaik是无用的,因为它会导致列中的值错误
在使用SQL和regex的配置单元中,有没有办法解决这个问题?这是可以做到的,尽管有两个配置单元表。首先将数据加载到一个包含以下列的表中:
IP, Date, Time, URL, Useragent
在这里,我建议使用外部
配置单元表-您不需要解析数据,而且此配置单元表不需要存在很长时间,因此只需将配置单元元数据放在上面即可:
CREATE EXTERNAL TABLE raw_log (
ip string,
date string,
time string,
url string,
useragent string
)
LOCATION '<hdfs_location_of_the_raw_log_folder>';
创建外部表原始日志(
ip字符串,
日期字符串,
时间字符串,
url字符串,
用户代理字符串
)
位置“”;
然后使用带有配置单元的regexp\u extract(字符串主题、字符串模式、int索引)
方法(请参阅)的INSERT-INTO
查询将其加载到具有正确列的“final”表中
您还可以编写自己的UDF,这将使您能够更好地处理您提到的不完整/缺失的值,尽管在每次输入数据的格式更改时您必须重新编译和重新部署JAR(请参见)。我使用一个表(userID)尝试了它,并成功地从我的原始数据表插入了所有userID。但是当我尝试将多个值插入一个新表时,userdata(userID,age)
我得到一个错误:insert into table userdate regexp\u extract(get userID),regexp\u extract(get age)as userID,age from raw\u data代码>生成:失败:SemanticException[错误10004]:第1行:125无效的表别名或列引用“age”:(可能的列名为:“原始数据中的所有列”)该方法接受三个参数,但您只给了它一个,并且在中有一个空格。我不知道“get”是从哪里来的。我的正则表达式很差,所以我不能提供很多帮助,但请看我链接的Hive UDF页面以查看一些使用示例。很抱歉,我在那里使用了一些伪代码,我实际上给了它三个参数,正则表达式可以工作(目前认为不是100%正确)但是SQL语法似乎不正确。请确保:INSERT INTO TABLE user_data选择regexp_extract(url,'userID=(……)',0),regexp_extract(url,'age=(……),,0)作为userID,age FROM raw_data代码>INSERT INTO TABLE user_data选择regexp_extract(url,'userID=(……)',0)作为userID,regexp_extract(url,'age=(……),,0)作为原始_数据的年龄代码>将修复此问题。