配置单元regex记录分隔符表中的空值

kgsdhlau  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(415)

请找到我的表格说明,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

问题是,虽然我的regex是正确的,在rubular.com上测试过,但我不能正确地上传数据,因为配置单元没有正确地将多行日志作为单个记录处理。我尝试了regex和日志的一个子集来进行单个解析,结果很好。
我试着玩弄房子 textinputformat.record.delimiter 但它不起作用。请给我一个正确的方法 textinputformat.record.delimiter ,从而实现正确的解析。

9udxz4iz

9udxz4iz1#

在你需要使用的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=[^\\"]*)"

相关问题