2017-07-10 26 views
1

テーブル内の生データを構文解析するための正規表現があります。',?([\w]*|\d*)'Hive - グループを作成して配列に割り当てるには、regxpを使用してください。

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 

これは、CSVフィールドを解析するグループを作成します。問題は、テーブルと解析する各行が長いため、これは高価な操作です。

私はグループ{n}なし(正規表現を使用して、配列に分割することができれば、私は、各フィールドを取得するために、配列のインデックスを使用することができ、私が思っていたような何か:。。

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

を私は知っていますこれが可能であるか、正しい構文/アプローチはどうあるべきかあればどのように多くのグループが表になりますが、わからないだろう。

感謝。

答えて

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

チェック更新の回答 –

関連する問題