2017-01-05 1 views
1

Je suis nouveau à Hive et mes connaissances en SQL sont un peu rouillées, ce qui pose une question sur SO.Hive: Remplir les colonnes manquantes

J'ai des données d'une table SAP dans laquelle les valeurs pour une colonne sont manquantes. Je voudrais savoir comment je peux remplir ces colonnes.

Exemple:

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

Dans le tableau ci-dessus, toutes les trois rangées sont reliées les unes aux autres, mais la valeur de la colonne EBELN est présent uniquement dans la première rangée. Lorsque je joins cette table avec une autre table en utilisant la colonne EBELN comme clé de jointure, seule la première ligne apparaît dans la jointure. Je veux amener toutes les trois lignes dans la jointure de sortie.

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

Je suis sortie attendant à être quelque chose comme ça pour que je puisse se joindre à cette table avec d'autres table en utilisant la colonne EBELN.

La table à laquelle je me joins ne contient pas la colonne BELNR ou EBELP donc je ne peux pas utiliser ces colonnes pour joindre.

Je voudrais savoir si je peux utiliser self join ou s'il y a autre chose que je peux utiliser ici.


Ajout de plus d'informations. J'ai une autre table permet de l'appeler "ABCD". Cette table contient la colonne EBELN.

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

je tente de se joindre à cette table "ABCD" avec table "EKPF" en utilisant la colonne EBELN.

Je dois obtenir toutes les lignes où le nombre BELNR est identique, mais comme BELNR colonne n'est pas présente dans le tableau ABCD, je ne peux pas l'utiliser pour y adhérer.

sortie finale devrait ressembler à joint

+----------+-----------+--------+--------+--------+ 
    | 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

Comment les lignes liées? par colonne BELNR? Comment la colonne EBELN doit-elle être calculée? – leftjoin

+0

Vous pouvez utiliser l'auto-jointure ou une autre méthode pour le calcul EBELN, mais vous devez d'abord définir la règle. – leftjoin

+0

Salut, Merci pour votre temps précieux. J'ai mis à jour les détails des questions pour refléter ce que j'ai l'intention de faire. – Shekhar

Répondre

0

De Ruche vous pouvez utiliser l'un des Conditional Functions fonction pour atteindre votre sortie.

Il suffit de faire ceci si vous utilisez COALSCE:

SELECT COALESCE(EBELN, 1L) AS EBELN, BELNR,EBELP FROM your_table; 

également de Hive 0.11 partir vous pouvez utiliser NVL Fonction

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

Si vous voulez pour tous les enregistrements de la première table (gauche) générer l'enregistrement correspondant dans le résultat, même s'il n'y a pas de correspondance dans la deuxième table (DROITE), vous utilisez LEFT rejoindre. Dans le cas inverse, on utilise RIGHT rejoindre. Parce que vous souhaitez conserver des enregistrements des deux côtés de la jointure, vous devez joindre 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 garantit ici, vous aurez la colonne de jointure peuplée (selon votre exemple).

La sortie serait:

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