2017-01-05 75 views
1

我是Hive的新手,我的SQL知識有點生疏,因此在SO上發佈了問題。Hive:填寫缺失的列

我有一個SAP列表中缺少一列值的數據。我想知道如何填充這些列。

實施例:

+----------+-----------+--------+ 
| EBELN | BELNR  | EBELP | 
|----------+-----------+--------| 
| 1  | 123  | 001 | 
|----------+-----------+--------| 
|   | 123  | 002 | 
|----------+-----------+--------| 
|   | 123  | 003 | 
+----------+-----------+--------+ 

在上述表中,所有的三排彼此相關的,但值EBELN列只存在於第一行。

當我使用EBELN列作爲連接鍵將此表與其他表連接起來時,只有第一行出現在連接中。我希望將所有三行都放在輸出連接中。

Expected output: 
    +----------+-----------+--------+ 
    | EBELN | BELNR  | EBELP | 
    |----------+-----------+--------| 
    | 1  | 123  | 001 | 
    |----------+-----------+--------| 
    | 1  | 123  | 002 | 
    |----------+-----------+--------| 
    | 1  | 123  | 003 | 
    +----------+-----------+--------+ 

我期待輸出是這樣的,這樣我可以通過使用EBELN列加入這個表與其他表。

我加入的表不包含BELNREBELP列,因此我無法使用這些列進行連接。

我想知道如果我可以使用self join或有什麼我可以在這裏使用的。


添加更多信息。我有其他表讓我們稱之爲「ABCD」。該表有EBELN列。

+----------+-----------+--------+ 
    | EBELN | COL12 | COL13 | 
    |----------+-----------+--------| 
    | 1  | ABC  | LMN | 
    |----------+-----------+--------| 
    | 2  | DEF  | OPQ | 
    |----------+-----------+--------| 
    | 3  | GHI  | RST | 
    +----------+-----------+--------+ 

我試圖加入這個「ABCD」表使用EBELN列「EKPF」表。

我需要得到所有的行,其中BELNR號碼是相同的,但因爲BELNR列不存在於ABCD表中,我不能用它來加入。

最終加盟輸出應該像

+----------+-----------+--------+--------+--------+ 
    | EBELN | BELNR  | EBELP | COL12 | COL13 | 
    |----------+-----------+--------+--------+--------| 
    | 1  | 123  | 001 | ABC | LMN | 
    |----------+-----------+--------+--------+--------| 
    |   | 123  | 002 | ABC | LMN | 
    |----------+-----------+--------+--------+--------| 
    |   | 123  | 003 | ABC | LMN | 
    |----------+-----------+--------+--------+--------| 
    | 2  |   |  | DEF | OPQ | 
    |----------+-----------+--------+--------+--------| 
    | 3  |   |  | GHI | RST | 
    +----------+-----------+--------+--------+--------+ 
+0

如何行相關?通過BELNR專欄?應如何計算EBELN列? – leftjoin

+0

您可以使用自聯接或其他方法進行EBELN計算,但需要先定義規則。 – leftjoin

+0

嗨,感謝您寶貴的時間。我已經更新了問題的細節,以反映我打算做的事情。 – Shekhar

回答

0

從蜂巢可以使用Conditional Functions功能之一來實現你的輸出。

只要做到這一點,如果使用COALSCE:

SELECT COALESCE(EBELN, 1L) AS EBELN, BELNR,EBELP FROM your_table; 
從蜂巢0.11

而且起,可以使用NVL功能

SELECT NVL(EBELN, 1) AS EBELN, BELNR,EBELP FROM your_table; 
0

如果你想爲所有從第一(左)表中的記錄在結果中生成相應的記錄,即使在第二個(RIGHT)表中沒有匹配項,也使用LEFT連接。對於相反的情況,一個使用RIGHT連接。因爲要保留連接兩端的記錄,所以需要FULL OUTER連接。

SELECT COALESCE(t1.EBELN, t2.EBELN), t1.BELNR, t1.EBELP , 
     t2.COL12, t2.COL13 
    FROM EKPF t1 
    FULL OUTER JOIN ABCD t2 ON t1.EBELN = t2.EBELN 

COALESCE這裏保證您將有填充列(根據您的示例)。

輸出將是:

+----------+-----------+--------+--------+--------+ 
| EBELN | BELNR  | EBELP | COL12 | COL13 | 
|----------+-----------+--------+--------+--------| 
| 1  | 123  | 001 | ABC | LMN | 
|----------+-----------+--------+--------+--------| 
|   | 123  | 002 | ABC | LMN | 
|----------+-----------+--------+--------+--------| 
|   | 123  | 003 | ABC | LMN | 
|----------+-----------+--------+--------+--------| 
| 2  |   |  | DEF | OPQ | 
|----------+-----------+--------+--------+--------| 
| 3  |   |  | GHI | RST | 
+----------+-----------+--------+--------+--------+