Unir tablas usando MultiMaps

La unión de dos tablas diferentes en sus columnas correspondientes se puede realizar mediante bucles anidados , pero una forma más eficaz y escalable es utilizar mapas múltiples . La idea es mapear desde cada valor de columna que queramos unir a todas las filas que lo contienen, para generar un multimapa desde una tabla a partir de ambas tablas.

El mapa múltiple generado tiene que estar basado en hash. Hashing es esencialmente una técnica que convierte un elemento grande en un elemento pequeño que representa el mismo elemento. Por lo tanto, genere el mapa múltiple para la tabla más pequeña, disminuyendo así su tiempo de generación y tamaño de memoria.

Ejemplo:

Acercarse:

  • Crea las dos tablas.
  • Ahora, obtenga la ID de las columnas en ambas tablas.
  • Luego cree e implemente un mapa múltiple para mapear a varias filas de la tabla B.
  • Imprima el resultado después de los pasos anteriores.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for hashjoin on two tables
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
 
// Generate two tables to join
using tab_t = vector<vector<string> >;
 
// Table 1
tab_t tab1{ // Age  Name
            { "32", "Rahul" },
            { "25", "Anshul" },
            { "17", "Lok" },
            { "25", "Akil" },
            { "17", "Anshul" }
};
 
// Table 2
tab_t tab2{ // Student  Friend
            { "Rahul", "Tim" },
            { "Rahul", "Siva" },
            { "Anshul", "Gary" },
            { "Anshul", "Azhar" },
            { "Lok", "Vamsi" }
};
 
// Overloading of Output Operator
ostream& operator<<(ostream& o,
                    const tab_t& t)
{
    // Iterate through the table t
    for (size_t i = 0; i < t.size(); ++i) {
        o << i << ":";
        for (const auto& e : t[i])
            o << '\t' << e;
        o << endl;
    }
    return o;
}
 
// Function that perform join operation
// on the two tables
tab_t Join(const tab_t& a, size_t columna,
           const tab_t& b, size_t columnb)
{
    unordered_multimap<string, size_t> hashmap;
 
    // Use of Hashmap
    for (size_t i = 0;
         i < a.size(); ++i) {
        hashmap.insert({ a[i][columna], i });
    }
 
    // Perform Mapping
    tab_t result;
    for (size_t i = 0; i < b.size(); ++i) {
 
        auto range = hashmap.equal_range(
            b[i][columnb]);
 
        // Create new joined table
        for (auto it = range.first;
             it != range.second; ++it) {
 
            tab_t::value_type row;
 
            // Insert values to row
            row.insert(row.end(),
                       a[it->second].begin(),
                       a[it->second].end());
            row.insert(row.end(),
                       b[i].begin(),
                       b[i].end());
 
            // Push the row
            result.push_back(move(row));
        }
    }
    return result;
}
 
// Driver Code
int main(int argc, char const* argv[])
{
    int ret = 0;
 
    // Given Tables
    cout << "Table A: " << endl
         << tab1 << endl;
    cout << "Table B: " << endl
         << tab2 << endl;
 
    // Function Call
    auto tab3 = Join(tab1, 1, tab2, 0);
 
    // Print the joined table
    cout << "Joined tables: " << endl
         << tab3 << endl;
    return ret;
}

Python3

# Python program for hashjoin on two tables
from collections import defaultdict
 
# Function that perform join operation
# on the two tables
def hashJoin(table1, index1, table2, index2):
 
    h = defaultdict(list)
 
    # Hash
    for s in table1:
        h[s[index1]].append(s)
 
    # Perform join operation
    return [(s, r) for r in table2 for s in h[r[index2]]]
 
# Driver Code
 
# Given two tables
table1 = [("32", "Rahul"),
           ("25", "Anshul"),
           ("17", "Lok"),
           ("25", "Akil"),
           ("17", "Anshul")]
 
table2 = [("Rahul", "Tim"),
          ("Rahul", "Siva"),
          ("Anshul", "Gary"),
          ("Anshul", "Azhar"),
          ("Lok", "Vamsi")]
 
# Print the resultant table
for row in hashJoin(table1, 1, table2, 0):
    print(row)
Producción:

Table A: 
0:    32    Rahul
1:    25    Anshul
2:    17    Lok
3:    25    Akil
4:    17    Anshul

Table B: 
0:    Rahul    Tim
1:    Rahul    Siva
2:    Anshul    Gary
3:    Anshul    Azhar
4:    Lok    Vamsi

Joined tables: 
0:    32    Rahul    Rahul    Tim
1:    32    Rahul    Rahul    Siva
2:    17    Anshul    Anshul    Gary
3:    25    Anshul    Anshul    Gary
4:    17    Anshul    Anshul    Azhar
5:    25    Anshul    Anshul    Azhar
6:    17    Lok    Lok    Vamsi

Publicación traducida automáticamente

Artículo escrito por akshayvarma72 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *