私は数十億行と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;
任意の助けを事前にどうもありがとうございました!
これを行う必要がある場合は、データベースのレイアウトが不十分になっている可能性があります。あなたの残高は、おそらく自分のテーブルに保存されるべきです。 – meagar
@meagar。はい、これは最高のレイアウトではないことに同意します。実際のところ、実際の表では、これらの天びんはそれぞれ、単一列のdata_structの要素に含まれています。データ構造体の要素ではなく列の文脈で質問すれば、もっと多くの人にとって問題になると思っただけです。私はそれがどんな風にレイアウトされているのかは分かりませんが、あなたが正しいと確信しています。私はデータが元々はHadoopにロードされる前のレガシーメインフレームシステムから来たと信じています。 – data101