2017-07-10 2 views
1

Ich habe einen regulären Ausdruck, um einige rohe Daten in einer Tabelle zu analysieren, etwas wie: ',?([\w]*|\d*)'.Hive - Verwenden Sie Regxp, um Gruppen zu erstellen und sie einem Array zuzuweisen

select regexp_extract(raw_line,',?([\w]*|\d*){1}',1) as field1 
     , regexp_extract(raw_line,',?([\w]*|\d*){2}',1) as field2 
     , ... 
     , regexp_extract(raw_line,',?([\w]*|\d*){n}',1) as fieldn 
from table 

Dies erstellt Gruppen zum Analysieren von CSV-Feldern. Das Problem besteht darin, dass die Tabelle und die zu analysierenden Zeilen lang sind. Dies ist also eine teure Operation.

ich mich gefragt, ob ich den regulären Ausdruck (ohne die Gruppe verwenden könnte {n} und spaltete es in ein Array, dann könnte ich den Array-Indizes verwenden, um jedes Feld zu bekommen So etwas wie:..

select arr_raw[0] as field1, 
      ..., 
     arr_raw[n] as fieldn 
from (
    split(
     select regexp_extract(raw_line, ',?([\w]*|\d*)' 
    , ) as arr_raw -- ?? 
)t 

Ich weiß, wie viele Gruppen werden in der Tabelle, aber nicht sicher, ob dies möglich ist, oder das, was der korrekte Syntax/Ansatz soll.

Dank.

Antwort

1
with raw_sample as (
select 'field1,field2,fiend3,123,456,"http://some.domain/abc/Player.aspx?playerID=111&BrowseIds=2221,423062611,423870887,424044345,...,",THIS_IS_MY,en,20 294 998 1001,end' as raw_line 
) 

select fields[0] as field0 
     ,fields[1] as field1 
     ,fields[2] as field2 
     ,fields[3] as field3 
     ,fields[4] as field4 
     ,fields[5] as field5 
     ,fields[6] as field6 
     ,fields[7] as field7 
     ,fields[8] as field8 
     ,fields[9] as field9 

from (select split(regexp_replace(raw_line,'(".*?"|[^,]*),',concat('$1',unhex(1))),'\\x01') as fields 

     from raw_sample 
     ) t 
; 
+0

prüfen aktualisiert Antwort –

Verwandte Themen