2017-05-24 1 views
1

J'ai une table avec 6 champs qui ressemble à ceci:Sélectionnez le champ suivant non vide dans la ruche

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

Je veux tirer les données de ce tableau ci-dessus à une nouvelle table avec 5 domaines où nous ignorons les valeurs vides. Ma table finale devrait ressembler à ceci:

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

J'ai commencé à écrire une requête conditionnelle massive avec CASE QUAND mais il dégénère et sujettes à des erreurs. Est-il possible d'obtenir cette table en utilisant une requête regex_extract dans Hive?

+0

Je don Je ne connais pas Hive SQL (ou Hive), mais je pourrais remettre en question votre design si vous vous retrouvez dans cette situation tion en premier lieu. Comment êtes-vous arrivé à ces données rares? –

+0

Si vous supprimez des données de colonne vides de l'instruction select de la requête, il est très probable que vous endommagiez les données. Comme dans l'exemple que vous avez donné JKL est la valeur de la colonne Field5 dans les données Inut mais dans la sortie, vous avez besoin de JKL à la valeur de Result4 Column. –

+0

Par "valeurs vides", voulez-vous dire des chaînes vides ou des valeurs NULL? –

Répondre

3

En supposant des "valeurs vides" sont des valeurs NULL

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

version simplifiée, en supposant une virgule (,) ne figure pas dans vos champs:

select ... 

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

En supposant des "valeurs vides" sont des chaînes vides

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

version simplifiée, en supposant une virgule (,) ne figure pas dans vos champs:

select ... 

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

C'est incroyable. J'ai encore tellement à apprendre. – nickfrenchy