2016-11-11 2 views
0

私は数十億行と100以上の列を持つハイブの表に取り組んでいます。膨大な数の列を結合します

100個の列のうち、最初のゼロ以外の値を合併する必要があります。私はこれを行うことができますが、それはコードの多くの行(各列に1行)が含まれています。私はまた別の列を作成しなければなりません。逆の場合、少なくともゼロ以外の最後の100を意味する最後のゼロ以外の値を見つける必要があります。各列の命名規則はbalance0、balance1、balance2などです。

より少ないコード行でこれを行うより良い方法があれば?私はウェブを検索し、値の合体について多くを見つけることができますが、私はこれに必要なコード行を減らすのに役立つ何かを見つけることができませんでした。

私が使用しているコードの簡易版は、以下の通りです:

SELECT urn 
     ,COALESCE(IF(balance0  <> '0', balance0, NULL)  
       ,IF(balance1  <> '0', balance1, NULL)  
       ,IF(balance2  <> '0', balance2, NULL)  
       ,IF(balance3  <> '0', balance3, NULL)  
       ,IF(balance4  <> '0', balance4, NULL)  
       ,IF(balance5  <> '0', balance5, NULL)  
       ,IF(balance6  <> '0', balance6, NULL)  
       ,IF(balance7  <> '0', balance7, NULL)  
       ,IF(balance8  <> '0', balance8, NULL)  
       ,IF(balance9  <> '0', balance9, NULL)  
       ,IF(balance10 <> '0', balance10, NULL)  
       ,IF(balance11 <> '0', balance11, NULL)  
       ,IF(balance12 <> '0', balance12, NULL)  
       ,IF(balance13 <> '0', balance13, NULL)  
       ,IF(balance14 <> '0', balance14, NULL)  
       ,IF(balance15 <> '0', balance15, NULL)  
       ,IF(balance16 <> '0', balance16, NULL)  
       ,IF(balance17 <> '0', balance17, NULL)  
       ,IF(balance18 <> '0', balance18, NULL)  
       ,IF(balance19 <> '0', balance19, NULL)  
       ,IF(balance20 <> '0', balance20, NULL)  
       ,IF(balanceX.... etc to balance100 
       )  
       AS first_positive_balance 
FROM  table_x;  

任意の助けを事前にどうもありがとうございました!

+0

これを行う必要がある場合は、データベースのレイアウトが不十分になっている可能性があります。あなたの残高は、おそらく自分のテーブルに保存されるべきです。 – meagar

+0

@meagar。はい、これは最高のレイアウトではないことに同意します。実際のところ、実際の表では、これらの天びんはそれぞれ、単一列のdata_structの要素に含まれています。データ構造体の要素ではなく列の文脈で質問すれば、もっと多くの人にとって問題になると思っただけです。私はそれがどんな風にレイアウトされているのかは分かりませんが、あなたが正しいと確信しています。私はデータが元々はHadoopにロードされる前のレガシーメインフレームシステムから来たと信じています。 – data101

答えて

0

質問で説明した場合、私は多くのショートカットが表示されません。 任意の数の引数で動作するカスタムUDF(genericUDF)を書くことができますが、 UDFを呼び出すときの列。

コメントの場合(構造体の多くの要素を結合します)、構造体だけをパラメーターとして受け取るカスタムUDFを記述することができます。ハイブ構造体は実際にはObject []として表されているので、構造体要素の数にかかわらずすべての関数を実装するのは簡単です。

Here's an exampleは、構造体のリストをパラメータとして受け取るgenericUDFです。

+0

この返事をありがとう。私はUDFで一度も行ったことはありませんが、それをやりたいです。これは本当に私に大量のコード行を保存するので、ありがとう! – data101

関連する問題