2017-06-28 7 views
0

ハイブには、SAPシステムからのデータが入っているテーブルが1つあります。以下に示すように、このテーブルは列とデータを持っている。上記のようにハイブ1つの列に基づく自己結合

+======================================================================+ 
|document_number | year | cost_centre | vendor_account_number | amount | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |      | 123.5 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 25.96 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |      | 586 | 
+----------------------------------------------------------------------+ 

vendor_account_number列の値は、1行中に存在し、私は、行のすべての残りの部分にそれをもたらすたいです。次のように

期待出力は次のとおりです。

+======================================================================+ 
|document_number | year | cost_centre | vendor_account_number | amount | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 123.5 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 25.96 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 586 | 
+----------------------------------------------------------------------+ 

これを実現するために、私はハイブ

にCTE次
with non_blank_account_no as(
    select document_number, vendor_account_number 
    from my_table 
    where vendor_account_number != '' 
) 

を書き、次のように外側の左自己が参加しました:

select 
    a.document_number, a.year, 
    a.cost_centre, a.amount, 
    b.vendor_account_number 
from my_table a 
left outer join non_blank_account_no b on a.document_number = b.document_number 
where a.document_number = ' ' 

しかし、以下に示すように出力が重複しています

+======================================================================+ 
|document_number | year | cost_centre | vendor_account_number | amount | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 123.5 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 25.96 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 586 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 123.5 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 25.96 | 
+----------------------------------------------------------------------+ 
|  1  | 2016 |  XZ10 |  1234567890  | 586 | 
+----------------------------------------------------------------------+ 

誰でも、私のHiveクエリーに何が間違っているのか理解してもらえますか?

+1

あなたのCTEの出力は何ですか? 1行だけですか? – Andrew

+0

@Andrew、はいCTEはvendor_account_numberがnullでない行を1つだけ選択することになっています – Shekhar

+0

1行しか持たないとわかっていますが、実際にはどれくらいの数の問題がありますか?確かにあなたはクロス・ジョインを得ているようです。 – Andrew

答えて

1

多くのユースケースでは自己結合は、Windowsの機能で置き換えることができ

select document_number 
     ,year 
     ,cost_center 

     ,max (case when vendor_account_number <> '' then vendor_account_number end) over 
     (
      partition by document_number 
     )          as vendor_account_number 

     ,amount 

from my_table  
+0

ありがとう、私はこれを試してみます。 – Shekhar

+0

答えを受け入れるための親切な思い出(答えに残された** V **記号を付けることによって) –

関連する問題