表中的HIVE REGEX记录DELIMITER空值

时间:2016-07-28 10:54:49

标签: regex hadoop hive deserialization

请查找我的表说明,Serde和日志格式。

create table temp.rawserversidedata

(
ip varchar(65000),
dt varchar(65000),
apiname varchar(65000),
appname varchar(65000),
contentid  varchar(65000),
eid varchar(65000),
version varchar(65000),
uid varchar(65000),
model varchar(65000)
)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "([0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\d+\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\"]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s")

STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';


REGEX : ([0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\d+\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\"]*)

日志格式 - 两个有效记录。

123.236.122.18|"-"|-|2016-07-21T23:59:24+08:00|GET|http|isarrs.go.le.com|"/sarrs/apigetstream_json.so?sign=9fc79acfa5a5de4aa2819672247436da&appname=Levidi&content_id=6575672&appfrom=letv&lc=867466026357389&platform=1&user_setting_country=IN&clientos=6.0.1&sales_area=IN&eid=0&version=1.1.3&lang=en_GB&uid=3214761836&resolution=1080*1920&model=Le+X526"|HTTP/1.1|200|450|447|202|"-"|"Dalvik/2.1.0 (Linux; U; Android 6.0.1; Le X526 Build/IIXOSOP5801607082S)"|"10.121.152.15:8080"|"0.717"|0.717
103.14.185.15|"-"|-|2016-07-21T23:59:18+08:00|GET|http|isarrs.go.le.com|"/sarrs/apigetstream_json.so?sign=b097e1fe9b280e658c909886971ab818&appname=Levidi&content_id=6575672&appfrom=letv&lc=867466026096383&platform=1&user_setting_country=IN&clientos=6.0.1&sales_area=IN&eid=0&version=1.1.3&lang=en_GB&uid=1712386504&resolution=1080*1920&model=Le+X526"|HTTP/1.1|200|450|447|202|"-"|"Dalvik/2.1.0 (Linux; U; Android 6.0.1; Le X526 Build/IIXOSOP5801607082S)"|"10.121.152.30:8080"|"0.684"|0.684

问题是虽然我的正则表达式是正确的,在rubular.com上测试,我无法正确上传数据,因为配置单元没有正确处理多行日志作为单个记录。我尝试了一个正则表达式和日志的子集进行单一解析,这很好用。

我试着玩弄房产 textinputformat.record.delimiter

但它不起作用。请建议我覆盖textinputformat.record.delimiter的正确方法,以便实现正确的解析。

1 个答案:

答案 0 :(得分:1)

在Hive中,无论您在正则表达式中使用"\\",都需要使用"\"

"input.regex" = "([0-9]{1,}\\.[0-9]{1,}\\.[0-9]{1,}\\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\\d+\\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\\"]*)"