2017-10-10 17 views
0

Je dois quitter la jointure externe 2 tables par colonne dans un tableau.Hive, joindre 2 tables par élément dans le tableau

Table de modèle:

  • id structure de chaîne -
  • ips - un tableau de chaînes

Tableau deux modèle:

  • ip - chaîne
  • nom d'hôte - chaîne

Le résultat que je désire est au format:

id, ip, nom d'hôte (si elle existe)

Toutes les adresses IP à partir d'un tableau dans le 1er tableau qui ont l'adresse IP correspondante dans la deuxième table doivent être apparié. Je ne sais pas par où commencer, toute idée ou référence est la bienvenue.

+0

Les modèles de tableaux avec des exemples de données sont nécessaires pour que les utilisateurs puissent se plonger dans votre question. – DanteTheSmith

+0

Tableau 1: structure id - chaîne, ips - tableau de chaînes. Table deux: ip-string, hostname-string. Le résultat est: id, ips, hostname (si existe) – user8753324

+0

J'ai fait quelques modifications à votre question. Si elle est approuvée j'espère que cela encouragera les gens à vous donner une réponse puisque c'est maintenant plus concis et plus facile à lire. – DanteTheSmith

Répondre

0

Vous pouvez utiliser l'option d'éclatement sur la deuxième table, puis effectuer la jointure comme ci-dessous.

Disons que vous avez un table_1 avec tableau de noms de chaîne et le tableau 2 est d'avoir le nom

CREATE TABLE table_1 (id chaîne, tableau ips); CREATE TABLE table_2 (chaîne ip, nom d'hôte int);

Ensuite, vous pouvez créer une vue latérale sur la table_1 avec l'UDF explode.

Sélectionnez id, ip de table_1 VUE LATÉRALE explode (ips) ep AS ip;

Ceci explose une seule ligne en plusieurs lignes pour chaque valeur du tableau. S'il vous plaît lire Lateral view documentation pour plus d'aide.

La requête de jointure finale sera quelque chose comme ceci.

SELECT t1.id,t1.ip, t2.hostname 
FROM 
(select id,ip from table_1 LATERAL VIEW explode(ips) ep AS ip) AS t1 
LEFT JOIN table_2 AS t2 
ON (t2.ip=t1.ip); 
+0

Est-ce que la solution ci-dessus a résolu votre problème? –