2016-07-28 15 views
0

Finden Sie meine Tabelle Beschreibung, Serde und Protokollformat.HIVE REGEX RECORD DELIMITER NULL WERTE IN TABELLE

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=[^\"]*) 

Protokollformat - zwei gültige Datensätze.

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 

Problem ist, dass, obwohl meine regex richtig, auf rubular.com getestet ist, kann ich nicht die Daten korrekt laden, weil hive nicht richtig mehrzeilige Protokolle als Einzelsatzverarbeitung ist. Ich habe versucht, eine Teilmenge der Regex und Protokolle für einzelne Parsing, und das hat gut funktioniert.

Ich habe versucht, mit der Eigenschaft textinputformat.record.delimiter

Aber es funktioniert nicht herumspielen. Bitte schlagen Sie mir eine korrekte Möglichkeit vor, textinputformat.record.delimiter zu überschreiben, um eine korrekte Analyse zu erreichen.

Antwort

1

In Hive müssen Sie "\\" verwenden, wo immer Sie "\" in regex

"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=[^\\"]*)" 
verwenden