2017-05-24 154 views
1

選擇下一個非空字段我有6場,看起來像這樣的表:在蜂巢

Field1 Field2 Field3 Field4 Field5 Field6 
ABC 45  XYZ   JKL BNM 
     65   QWE JKL  
WER   YUI IOP GHJ 

我想從該表中提取數據到以上5個領域,我們忽略了一個新的表空值。我最後的表應該是這樣的:

Result1 Result2 Result3 Result4 Result5 
ABC  45  XYZ  JKL  BNM 
65  QWE  JKL 
WER  YUI  IOP  GHJ 

我已經啓動的時候,但它的失控和容易出錯寫了大規模的條件查詢使用CASE。 是否可以在Hive中使用regex_extract查詢來獲取該表?

+0

我不不瞭解Hive SQL(或Hive),但如果最終出現在這種情況下,我可能會質疑您的設計首先是重刑。你是如何得到這種稀疏數據的? –

+0

如果您從查詢的select語句中刪除空列數據,則很可能會損壞數據。就像您在JKL中給出的例子是Inut數據中列Field5的值一樣,但是在輸出中,您需要JKL來指定Result4列的值。 –

+0

「空值」是指空字符串還是空值? –

回答

3

假設 「空值」 是空值

select fields[0] as Field1 
     ,fields[1] as Field2 
     ,fields[2] as Field3 
     ,fields[3] as Field4 
     ,fields[4] as Field5 

from (select split(concat_ws(string(unhex(1)),*),'\\x01') as fields 
     from mytable 
     ) t 

+--------+--------+--------+--------+--------+ 
| field1 | field2 | field3 | field4 | field5 | 
+--------+--------+--------+--------+--------+ 
| ABC | 45  | XYZ | JKL | BNM | 
| 65  | QWE | JKL | (null) | (null) | 
| WER | YUI | IOP | GHJ | (null) | 
+--------+--------+--------+--------+--------+ 

簡化版,假設逗號(,)不會出現在你的領域:

select ... 

from (select split(concat_ws(',',*),',') as fields 
     from mytable 
     ) t 

假設 「空值」 是空字符串

select fields[0] as Field1 
     ,fields[1] as Field2 
     ,fields[2] as Field3 
     ,fields[3] as Field4 
     ,fields[4] as Field5 

from (select split(regexp_replace(concat_ws(string(unhex(1)),*),'^\\x01+|\\x01+$|(\\x01)+','$1'),'\\x01') as fields 
     from mytable 
     ) t 

+--------+--------+--------+--------+--------+ 
| field1 | field2 | field3 | field4 | field5 | 
+--------+--------+--------+--------+--------+ 
| ABC | 45  | XYZ | JKL | BNM | 
| 65  | QWE | JKL | (null) | (null) | 
| WER | YUI | IOP | GHJ | (null) | 
+--------+--------+--------+--------+--------+ 

簡化版,假設逗號(,)不會出現在你的領域:

select ... 

from (select split(regexp_replace(concat_ws(',',*),'^,+|,+$|(,)+','$1'),',') as fields 
     from mytable 
     ) t 
+0

這太神奇了。我仍然有這麼多要學習。 – nickfrenchy