2016-07-09 9 views
1

die Eingabedatei ist wie folgt zu verwendenHIVE SERDE REGEX: Ausgabeformat - wollen nur wenige der Ausgangs Strings

eno :: ename :: dept :: sal

101 :: ang1 :: comp1 :: 2800000

201 :: EMP2 :: comp2 :: 2800000

301 :: EMP3 :: comp3 :: 3400000

401 :: EMP4 :: COMP4 :: 3600000

501 :: emp5 :: COMP5 :: 400000

>create table emp(ename string,edept string) 
> row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'   
> WITH SERDEPROPERTIES(               
> "input.regex"="^([^\\::]+)\\::([^\\::]+)\\::([^\\::]+)\\::([^\\::]+)$",   
> "output.format.string"="%2$s%3$s")            
> ; 
>load data local inpath '/home/cloudera/test/emp.txt' into table emp; 

i nur die 2. und 3. Literale in die Tabelle ziehen wollen. Also mit "output.format.string" = "% 2 $ s% 3 $ s" - ist das richtig?

Aber meine Tabelle wird nur mit eno & ename geladen.

Antwort

1

Die Hive-Tabelle hat nur zwei Spalten, aber Regex erfasst vier Gruppen, daher werden die zusätzlichen Gruppen einfach ignoriert.

Sie können den folgenden Ausdruck verwenden.

"input.regex"="^[^\\::]+\\::([^\\::]+)\\::([^\\::]+)\\::[^\\::]+$" 

Sie erhalten die folgende Ausgabe.

emp.ename emp.edept 
emp1  comp1 
emp2  comp2 
emp3  comp3 
emp4  comp4 
emp5  comp5