2017-05-04 2 views
0

J'utilise serde pour lire des données avec un format spécifique avec délimiteur |regex pour la chaîne de délimiteur spécifique dans Hive serde

Une ligne de mes données peut ressemble: key1 = valeur2 | key2 = valeur2 | key3 = "va, Lues", et je créer la table ruche comme ci-dessous:

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; 

Je dois extraire toutes les valeurs, ignorer tous les quotas s'ils existent. Résultat ressemble à un

value2 value2 va , lues 

Comment puis-je changer mon expression rationnelle actuelle pour les valeurs de extractig?

+0

Quel est votre résultat de sortie courant pour l'entrée donnée? – horcrux

+0

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

+0

Alors changez simplement ceci: '" input.regex "=" [^ \\ | =] * = \ "? ([^ \\ |] *) \ "? \\ | [^ \\ | =] * = \"? ([^ \\ |] *) \ "? \\ | [^ \\ | =] * = \"? ([^ \\ | ] *) \ "?", ' – horcrux

Répondre

0

Je peux actuellement offrir 2 options, aucune d'elles n'est parfaite.
BTW, "output.format.string" est obsolète et n'a aucun effet.

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" | 
+--------+--------+-------------+