2017-05-04 5 views
0

Ich benutze serde, um Daten mit spezifischem Format mit Trennzeichen | zu lesenregex für spezifische Trennzeichenfolge in Hive serde

Eine Zeile meiner Daten kann aussehen wie: key1 = Wert2 | key2 = Wert2 | key3 = "va, Lues", und ich erstellen Sie die Struktur Tabelle wie folgt:

CREATE EXTERNAL TABLE(
field1 STRING, 
field2 STRING, 
field3 STRING 
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
    "input.regex" = "([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)", 
    "output.format.string" = "%1$s %2$s %3$s" 
) 
STORED AS TEXTFILE; 

Ich muss extrahiere alle Werte, ignoriere alle Kontingente, wenn sie existieren. Ergebnis sieht aus wie ein

value2 value2 va , lues 

Wie kann ich meine aktuelle regexp für extractig Werte ändern?

+0

Was Ihr aktuelles Ausgabeergebnis für den angegebenen Eingang ist? – horcrux

+0

key1 = value2 key2 = value2 key3 = "va, lues" – rmnvnv

+0

Ändere das einfach: '" input.regex "=" [^ \\ | =] * = \ "? ([^ \\ |] *) \ "? \\ | [^ \\ | =] * = \"? ([^ \\ |] *) \ "? \\ | [^ \\ | =] * = \"? ([^ \\ | ] *) \ "?", ' – horcrux

Antwort

0

Ich kann derzeit 2 Optionen anbieten, keine von ihnen ist perfekt.
BTW, "output.format.string" ist veraltet und hat keine Wirkung.

create external table mytable 
(
    q1   string  
    ,field1  string 
    ,q2   string 
    ,field2  string 
    ,q3   string 
    ,field3  string 
) 
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
with serdeproperties ('input.regex' = '.*?=(?<q1>"?)(.*?)(?:\\k<q1>)\\|.*?=(?<q2>"?)(.*?)(?:\\k<q2>)\\|.*?=(?<q3>"?)(.*?)(?:\\k<q3>)') 
stored as textfile 
; 

select * from mytable 
; 

+----+--------+----+--------+----+-----------+ 
| q1 | field1 | q2 | field2 | q3 | field3 | 
+----+--------+----+--------+----+-----------+ 
| | value2 | | value2 | " | va , lues | 
+----+--------+----+--------+----+-----------+ 
create external table mytable 
(
    field1 string 
    ,field2 string 
    ,field3 string 
) 
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' 
with serdeproperties ('input.regex' = '.*?=(".*?"|.*?)\\|.*?=(".*?"|.*?)\\|.*?=(".*?"|.*?)') 
stored as textfile 
; 

select * from mytable 
; 

+--------+--------+-------------+ 
| field1 | field2 | field3 | 
+--------+--------+-------------+ 
| value2 | value2 | "va , lues" | 
+--------+--------+-------------+ 
Verwandte Themen