Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从配置单元中的列字段提取键:值_Mysql_Sql_Regex_Hadoop_Hive - Fatal编程技术网

Mysql 从配置单元中的列字段提取键:值

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

我目前正在学习/测试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的
。。。格式化以“&”结尾的分隔字段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)作为原始_数据的年龄将修复此问题。