2017-04-10 8 views
0

nullチェックを実装しようとしています。例えばのため:ハイブの指定された条件で1行から複数​​の行を作成する

Col_A | Col_B | Col_C | Col_D | New_Col 
null | boy | null | dust | Col_A failed null check 
null | boy | null | dust | Col_D failed null check 

これを行うための適切な方法は何ですか:次に

Col_A | Col_B | Col_C | Col_D 
null | boy | null | dust 

は、私は出力をしたいですか?

答えて

1
select t.* 
     ,concat(elt(e.pos+1,'Col_A','Col_B','Col_C','Col_D'),' failed null check') as New_Col 
from mytable t lateral view posexplode (array(Col_A,Col_B,Col_C,Col_D)) e 
where e.val is null 
+0

ありがとうございます。私はハイブを始めたばかりなので、あなたはeltが何をしたのかを詳しく教えてください。 –

+0

'elt'はN番目の要素を返します(' e.pos'は0から始まります) –

1

一つの方法は、union allを使用しています。

select Col_A, Col_B, Col_C, Col_D, 'Col_A failed NULL check' as new_col 
from t 
where Col_A is null 
union all 
select Col_A, Col_B, Col_C, Col_D, 'Col_B failed NULL check' as new_col 
from t 
where Col_B is null 
union all 
select Col_A, Col_B, Col_C, Col_D, 'Col_C failed NULL check' as new_col 
from t 
where Col_C is null 
union all 
select Col_A, Col_B, Col_C, Col_D, 'Col_D failed NULL check' as new_col 
from t 
where Col_D is null; 

これはかなり強引です。たくさんの列がある場合は、スプレッドシートを使用してSQLを生成できます。また、各サブクエリに対して個別のスキャンが必要です。

+0

私たちはたくさんの小切手と約1,000万のレコードを持っているので、これは機能しません。 –

+0

@ManishVishnoi。 。 。これは動作します、あなたはコードを書く必要があります。いずれにしても、あなたが求める質問に答えることは可能です。あなたは約2列と1種類の小切手を尋ねました。別の質問がある場合は、*別の質問としてそれを聞いてください。 –

関連する問題