HIVE
Hive
Dove si posiziona nel panorama BigData ?
HIVE
PIG
Data WareHouse
in Hadoop: Hive
Hadoop consente normalmente di affrontare problemi di Data WareHouse, ma scrivere
job complessi per il map/reduce è un processo lungo e complesso
Nel mondo del Data WareHouse e dell'analisi dei dati, i linguaggi di query (SQL) sono
un modo molto comune di accedere ai dati e molti analisti di dati non sono a loro agio
con Java o un linguaggio di scripting come Pig
Hive si propone come strumento per la trasformazione e la gestione dei dati non
strutturati caratteristici di Hadoop fornendo un approccio simile al SQL
Data WareHouse
Cosa intendiamo
Per Data WareHouse intendiamo un archivio informatico contenente dei dati (di
un'azienda, di un ente di ricerca ecc...) progettati per consentire di produrre facilmente
analisi e relazioni utili a fini decisionali.
All'interno del Data WareHouse troviamo una serie di strumenti che vengono utilizzati
per localizzare, estrarre, trasformare e caricare i dati, gestire e recuperare i metadati e
tutti gli strumenti applicabili al business intelligence
Hive
Un po' di storia
Per la gestione dei dati in Facebook si usava abitualmente Hadoop
L'uso continuativo aveva però evidenziato alcune criticità del sistema:
- necessità di utilizzare unicamente map reduce
- codice scarsamente riutilizzabile
- propensione agli errori
- complesse sequenze di job map reduce
L'idea fu quindi quella di realizzare un tool per:
- poter gestire dati non strutturati come fossero delle tabelle
- basarlo su query SQL che possano agire direttamente su queste tabelle
- generare automaticamente catene di job se necessario
Hive
Un esempio pratico: WordCount
CREATE TABLE docs (line STRING);
LOAD DATA INPATH 'ebook' OVERWRITE INTO TABLE docs;
CREATE TABLE word_counts AS
SELECT word, count(1) AS count FROM(SELECT explode(split(line, '\s')) AS word FROM docs)w
GROUP BY wordORDER BY word;
Hive
Architettura
JDBC ODBC
Thrift Server
HWI
CLI
Metastore
Driver(compilazione, ottimizzazione,
esecuzione)
HIVE
Hive
Driver
Driver(compilazione, ottimizzazione,
esecuzione)
HIVE
HDFS
HADOOP
JobTracker NameNode
Master
Il Driver:
- riceve tutti i comandi e le query- le compila- ottimizza il di calcolo richiesto- le esegue, tipicamente con job MapReduce
Quando sono richiesti lavori di MapReduce, Hive non genera i programmi Java MapReduce.Utilizza un file XML per rappresentare il workflow necessario con Mapper e Reducer generici.
Comunica poi con il JobTracker per avviare il processo MapReduce.
Non è necessario che Hive sia eseguito nello stesso nodo master con il JobTracker.
Hive
Metastore
Metastore
HIVE
Il Metastore è un database relazionale a parte dove Hive memorizza metadati di sistema e gli schemi delle tabelle.
Per impostazione predefinita, Hive utilizza Derby SQL Server, che fornisce funzionalità limitate ma sufficienti per una macchina in pseudo distributed mode.
Una delle maggiori limitazioni di Derby è l'impossibilità di eseguire due istanze simultanee CLI.
Quando però si passa a configurare un cluster di dimensioni maggiori risulta indispensabile utilizzare un database relazionale esterno (ad es. MySql)
Hive
CLI e HWI
HIVE
Con la CLI è possibile sottomettere delle query su Hive da linea di comando. È anche lo strumento che fornisce la possibilità di scrivere script contenenti sequenze di comandi e sottometterli al sistema
La HWI (Hive Web Interface) ci fornisce invece una semplice interfaccia web chiamato Hive web per interagire con il sistema
Possiamo inoltre interagire con Hive con altri sistemi quali Hue, Karmasphere, Qubole ecc
CLI
HWI
Hive
CLI
La CLI di Hive è versatile, ci consente infatti di:
- interagire con Hive con una shell simile a quella di MySql hive
- lanciare una singola queryhive -e '<comando>'
- effettuare il dump del risultato di una query hive -S -e '<comando>' > out.txt
- eseguire uno script localehive -f myScript
- eseguire uno script presente nell'hdfshive -f hdfs://<namenode>:<port>/myScript
Hive
JDBC, ODBC e Thrift Server
HIVE
Gli ultimi componenti di Hive forniscono ulteriori vie d'accesso al sistema di interrogazione, in particolare abbiamo:
- un server Thrift che fornisce l'accesso (anche remoto) da parte di altri processi che utilizzano linguaggi quali Java, C++, Ruby ecc
- i moduli JDBC e ODBC che forniscono le API d'accesso per le interrogazioni su Hive
Thrift Server
ODBCJDBC
Hive
Strumenti di sviluppo
Per comodità d'utilizzo
durante la parte pratica
utilizzeremo un plugin che
consente di scrivere e
lanciare i comandi Hive
direttamente da browser.
Hive
HiveQL
Introduzioneal linguaggio
Hive
Primitive Data Types
Hive accetta i principali tipi di dato “ereditandoli” dal linguaggio Java:
TINYINT, dimensione 1 byte, signed integer
SMALLINT, dimensione 2 byte, signed integer
INT, dimensione 4 byte, signed integer
BIGINT, dimensione 8 byte, signed integer
BOOLEAN
FLOAT, single precision floating point
DOUBLE, double precision floating point
STRING, sequenza di caratteri (specificata con apici singoli o doppi)
TIMESTAMP, Integer, float, or string
BINARY, array di bytes
Hive
Collection Data Types: Struct
E' l'analogo di una struct C o a un “oggetto” semplice (privo di metodi) e ne rispecchia sia le modalità di definizione che di accesso.
Ad esempio se si vuole definire una struttura chiamata date di tipo STRUCT
date STRUCT<year:INT, month:INT, day:INT>,
e successivamente per accedere ai singoli campi si utilizza la tipica notazione “punto”. Ad esempio:
date.year
Hive
Collection Data Types: Array
Sono sequenze ordinate di dati aventi lo stesso tipo che sono indicizzabili utilizzando degli interi.
Ad esempio se vogliamo definire un campo chiamato volume di tipo ARRAY
volume ARRAY<INT>
Ipotizzando che essa contenga:
['31', '28']
per accedere al secondo elemento dovremo scrivere volume[1]
Hive
Collection Data Types: Map
È una collezione di coppie chiave-valore
Se vogliamo definire una MAP chiamata sellers
sellers MAP<STRING, FLOAT>
Ipotizziamo che contenga le coppie
< 'Connor' , 65367 >< 'Malley' , 92384 >< 'Burns' , 52453 >
per ricavare il valore corrispondente alla chiave Burns scriveremo:
sellers['Burns']
Hive
Text Files Encoding
Tipicamente Hive legge dei dati da file di tipo testuale, ad esempio CSV o TSV
Hive utilizza dei caratteri di controllo di default che hanno meno probabilità di comparire tra le stringhe da considerare come valore di campo.In particolare
\n separatore di linea^A rappresentato dalla stringa \001, separatore di colonna^B rappresentato dalla stringa \002, separatore dei valori negli struct e negli array o
delle coppie chiave-valore nei map^C rappresentato dalla stringa \003, separatore inserito tra la singola coppia chiave-
valore all'interno del map
Hive
Text Files Encoding
Codice corrispondente alle impostazioni di default:
ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\001'COLLECTION ITEMS TERMINATED BY '\002'MAP KEYS TERMINATED BY '\003'LINES TERMINATED BY '\n'STORED AS TEXTFILE ;
Hive
HiveQL
Comandidi base
Hive
Database
Per la creazione di un database in Hive usiamo il comando
CREATE DATABASE IF NOT EXISTS financials;
Possiamo anche aggiungere una serie di metadati (localizzazione dei dati, informazioni sull'autore, sulla data di creazione, commenti ecc)
Ad esempio per specificare dove scrivere i dati sull'HDFS:
LOCATION '/user/hue/financials_db';
Hive
Database
Per visualizzare le proprietà di un certo database usiamo:
DESCRIBE DATABASE financials;
Per cancellarlo invece:
DROP DATABASE financials;
Hive
Tipologia di Tabelle
La creazione delle tabelle in Hive ricorda in maniera particolare la creazione delle tabelle in SQL
Esistono due principali tipi di tabelle:
- Tabelle ordinarie (non partizionate)- Tabelle partizionate
Che a loro volta possono essere suddivise in:
- Tabelle interne- Tabelle esterne
Hive
Tabelle ordinarie: Tabelle Interne
In questo tipo di tabelle:
Hive assume di avere la “proprietà” dei dati
Abbiamo che il file contenente i dati viene spostato dalla posizione originale all'interno della cartella che rappresenta la nostra tabella nell'HDFS
Questo perché:- i dati importati non devono subire modifiche per il principio generale di “una sola
scrittura, molte letture”- copiare i dati potrebbe voler dire copiare petabytes di file
Si ha che:- il file importato viene spostato dalla sua posizione originale in una cartella, creata all'interno dell'HDFS, che rappresenta la tabella- la struttura della tabella viene memorizzata all'interno del metastore di Hive
Hive
Tabelle ordinarie: Tabelle Esterne
Utilizzano dei dati “al di fuori” dal controllo diretto di Hive in maniera da essere lasciati a disposizione di eventuali altri tool (es. Pig) per effettuare ulteriori e/o differenti elaborazioni.
La creazione di questo tipo di tabelle è che:
- il file importato viene mantenuto all'interno della posizione originaria
- non viene creata, all'interno dell'HDFS, alcuna cartella che rappresenta la tabella da creare
- la struttura della tabella viene memorizzata all'interno del metastore di Hive
Hive
Creazione delle Tabelle
Ipotizziamo di partire da un file così costituito
Hive
Creazione della Tabella Interna
CREATE TABLE financials.nyse (exchange_col STRING,stock_symbol STRING,date STRUCT<year:INT, month:INT, day:INT>,stock_price_open FLOAT,stock_price_high FLOAT,stock_price_low FLOAT,stock_price_close FLOAT,stock_volume INT,stock_price_adj_close FLOAT
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'COLLECTION ITEMS TERMINATED BY '-'STORED AS TEXTFILE ;
Hive
Importare i dati in una Tabella Interna
Il comando per importare i dati in una tabella è il seguente:
LOAD DATA INPATH '/user/hue/nyse' OVERWRITE INTO TABLE financials.nyse;
Hive
Creazione della Tabella Esterna e Importazione dei Dati
CREATE EXTERNAL TABLE financials.stock (exchange_col STRING,stock_symbol STRING,date STRUCT<year:INT, month:INT, day:INT>,stock_price_open FLOAT,stock_price_high FLOAT,stock_price_low FLOAT,stock_price_close FLOAT,stock_volume INT,stock_price_adj_close FLOAT
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'COLLECTION ITEMS TERMINATED BY '-'LOCATION '/user/hue/data' ;
Hive
Cancellare una tabella
Per cancellare una tabella non dovremo fare altro che utilizzare il comando
DROP TABLE IF EXISTS financials.nyse;
Il comportamento è differente nel caso si tratti di una tabella interna o esterna:
- in caso di tabella interna, viene cancellato lo schema della tabella e anche tutti i dati ad essa associati
- in caso di tabella esterna, viene cancellato lo schema della tabella ma non tutti i dati associati
Hive
Tabelle Partizionate
La tabella partizionata è una tabella nella quale i dati d'origine vengono, in fase d'importazione, suddivisi in sotto categorie (le partizioni) che corrispondono a una differente gerarchizzazione dei dati all'interno dell'HDFS
L'utilizzo di queste tabelle comporta tre grossi vantaggi:
- maggior velocità delle query: non si va ad analizzare per intero un unico (o più) file di grosse dimensioni ma si potrà usufruire di una prima scrematura dei dati
- gerarchia dei dati anche per altri tool (es. Pig)
- la dimensione complessiva dei dati diminuisce: vengono eliminati dai dati finali tutti i riferimenti ai dati di partizionamento
Un'efficiente partizionamento dipende dalla conoscenza dei dati e dalle principali query che l'utente potrebbe lanciare
Hive
Tabella Partizionata – Tabelle interne ed esterne
Anche le tabelle partizionate possono essere create come tabelle esterne.
Per le caratteristiche delle tabelle partizionate, e per i vantaggi che esse offrono, si ha però una differenza comportamentale rispetto alle tabelle non partizionate:
● l'importazione dei dati all'interno di una tabella partizionata comporta SEMPRE la copia dei dati nella directory di riferimento per la tabella.
La cancellazione invece ha il medesimo comportamento:
● la cancellazione della tabella partizionata, se interna, comporta la perdita dei dati;
● la cancellazione della tabella partizionata, se esterna, consente di preservare i dati per eventuali differenti usi.
Hive
Creazione delle Tabelle
Hive
Tabella Partizionata – Dati nell'HDFS
Nel momento della scrittura dei dati Hive suddivide i dati in ingresso in un albero di cartelle su HDFS nella forma
…/ Anno / Stock Exchanges / Indice / Altri Valori
ad esempio:
…/ year=2012 / exchange_col=LSEG / stock_symbol=IBM / 000000_0...
…/ year=2013 / exchange_col=NYSE / stock_symbol=AXE / 000000_0…/ year=2013 / exchange_col=NYSE / stock_symbol=ANH / 000000_0
...
…/ year=2014 / exchange_col=NYSE / stock_symbol=ANH / 000000_0
Hive
Tabella Partizionata – Struttura
La struttura logica delle tabelle partizionate prevede che vengano utilizzate le prime colonne per rappresentare i campi non partizionati e che le partizioni, in ordine gerarchico, vengano messe in coda alla tabella
{campo comune, … , campo comune, livello_partizione_1, … , livello_partizione_N}
A causa di questa struttura risulta complesso caricare i dati da file dove gli elementi non siano correttamente disposti
Si preferisce effettuare l'import dei dati su una tabella non partizionata (anche esterna) e poi effettuare una copia dei dati all'interno della tabella partizionata
Hive
Tabella Partizionata – Creazione
Possiamo creare la nostra nuova tabella partizionata con
CREATE TABLE financials.part (month INT,day INT,stock_price_open FLOAT,stock_price_high FLOAT,stock_price_low FLOAT,stock_price_close FLOAT,stock_volume INT,stock_price_adj_close FLOAT
)PARTITIONED BY (year INT, exchange_col STRING, stock_symbol STRING);
Hive
Tabella Partizionata – Importazione Implicita
E possiamo caricare i dati a partire dalla tabella esterna creata precedentemente e chiamata financials.stock
INSERT OVERWRITE TABLE financials.partPARTITION (year, exchange_col, stock_symbol)SELECT date.month,date.day,stock_price_open,stock_price_high,stock_price_low,stock_price_close,stock_volume,stock_price_adj_close,date.year,exchange_col,stock_symbolFROM financials.stock;
Hive
Tabella Partizionata – Importazione Esplicita
E possiamo caricare i dati a partire dalla tabella esterna creata precedentemente e chiamata financials.stock
INSERT OVERWRITE TABLE financials.partPARTITION (year='date.year',exchange_col='exchange_col',stock_symbol='stock_symbol')SELECT date.month,date.day,stock_price_open,stock_price_high,stock_price_low,stock_price_close,stock_volume,stock_price_adj_closeFROM financials.stock;
Hive
Tabella Partizionata – Importazione
A fronte di una visualizzazione logica dei dati completa
Il file fisico che li rappresenta risulta essere
… / year=2000 / exchange_col=NYSE / stock_symbol=AXE / 000000_0
Partizioni
Hive
HiveQL
Comandidi base per le SELECT
Hive
Queries: SELECT … FROM
Come abbiamo visto in precedenza è possibile utilizzare il comando SELECT come l'analogo operatore di proiezione presente nel SQL per andare a specificare la (o le) colonne di nostro interesse.
Il FROM, in maniera analoga al SQL, specifica la tabella, la vista o la query annidata, dalla quale bisogna partire al fine di effettuare il corretto SELECT.
Possiamo ad esempio scrivere:
SELECT date.year , stock_symbol FROM financials.stock;
SELECT fst.date.year , fst.stock_symbol FROM financials.stock fst;
dove nel secondo caso specifichiamo un alias per identificare la tabella di riferimento.
Hive
Select: Operatori aritmetici
Con il SELECT non si possono solo effettuare delle pure “selezioni” di dati ma è anche possibile effettuare una serie di operazioni di manipolazione di diversa natura
Hive
Select: Altri Operatori e funzioni
In Hive sono presenti una serie di altri operatori:
● operatori relazionali (> , <, ==, ecc);● operatori logici (AND, OR, ecc);● funzioni matematiche (rand, abs, sqrt, ecc);● funzioni legate alle collezioni di dati (size, contains, ecc);● funzioni legate alle date (timestamp, year, ecc);● funzioni legate alle stringhe (concat, length, locate, ecc);● funzioni di aggregazione (count, max, variance, ecc);
… ed altre ancora … Tutti gli operatori e le funzioni sono comunque documentate nel wiki di Hive
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
Hive
Select: Esempi d'uso
SELECT lower(stock_symbol), date.year+13 FROM financials.stock;
SELECT count(*), avg(stock_volume) FROM financials.stock;
Hive
Select: Alias
Il risultato di un'operazione di SELECT può essere associato a una colonna “alias”: questa colonna è un riferimento per eventuali SELECT concatenati
Ad esempio:
SELECT count(*) as rows,avg(stock_volume) as avg_volumeFROM financials.stock;
Hive
Select: Where
Così come il SELECT seleziona le colonne da restituire, il WHERE filtra i singoli record in base al loro contenuto.
La clausola WHERE può sfruttare differenti funzioni predicato. SELECT count(*) as rows,avg(stock_volume) as avg_volumeFROM financials.stockWHERE stock_volume > 57390*3;
Hive
Select concatenati
Un possibile esempio d'uso di SELECT concatenati è il seguente
FROM (SELECT lower(stock_symbol) as lower_sym,stock_volume as volume,date.year+13 as update_ageFROM financials.stock) sd
SELECT sd.update_age,sd.lower_sym,sd.volumeWHERE sd.volume > (57390 * 3);
Hive
Select: Like e Rlike
In Hive abbiamo due particolari operatori predicato a cui prestare attenzione: LIKE e RLIKE.
SELECT stock_symbol FROM financials.stockWHERE stock_symbol LIKE 'C%';
RLIKE viene utilizzato per specificare eventuali regular expression su cui non ci soffermiamo qui
Hive
Select: Case … When … Then
Anche in Hive è possibile utilizzare un costrutto “if” in relazione al valore assunto da una specifica colonna, ad esempio:
SELECT stock_symbol, stock_volume,CASE
WHEN stock_volume < 57390 THEN 'low'WHEN stock_volume < 57390*2 THEN 'middle'WHEN stock_volume < 57390*3 THEN 'high'ELSE 'very high'
ENDFROM financials.stock LIMIT 5;
Hive
Select: Group By
Il GROUP BY viene utilizzato in funzioni di aggregazione per raggruppare i risultati di una o più colonne.
SELECT stock_symbol as symbol, avg(stock_volume) as average FROM financials.stockGROUP BY stock_symbol;
Hive
Select: Having
Con la clausola HAVING possiamo poi specificare quali risultati andare a mostrare con il nostro GROUP BY
SELECT stock_symbol, avg(stock_volume) as average FROM financials.stockGROUP BY stock_symbol HAVING average > 5000;
Hive
Select: Le viste
Quando una query diventa lunga o complicata le viste possono essere utilizzate per nascondere la complessità e dividere la query stessa in più blocchi elementari
CREATE VIEW symbol ASSELECT stock_symbol, avg(stock_volume) as average FROM financials.stockGROUP BY stock_symbol;
SELECT * FROM symbol;
Hive
Select: Order By e Sort By
A causa delle dimensioni dei database in HIVE sono presenti due diversi comandi per effettuare l'ordinamento:
L'ORDER BY, simile nel funzionamento a quello degli altri linguaggi SQL, esso effettua un ordinamento completo del risultato della query: tutti i dati vengono passati a un singolo reducer con rischio di tempi d'attesa eccessivamente lunghi.
SORT BY: ordina i dati in ogni reducer realizzando un ordinamento “locale” e, al termine, effettua una concatenazione dei risultati parziali.
L'ordinamento effettuato dai due sistemi potrebbe quindi risultare differente.
Hive
Order By
Map 1
Map 2
Map 3
Map 4Reduce Globale
Map N -1
Map N
...
output
Hive
Sort By
Map 1
Map 2
Map 3
Map 4
Reduce Locale 1
Reduce Locale 2
Map N -1
Map N
Reduce Locale N
......
output
Hive
Order By e Sort By: confronto
Reduce 1
Reduce 2
Reduce N
...
PRPGVZ
AFGANH
ZLSRPP
GVZPRP
AFGANH
RPPZLS
GVZPRPAFGANHRPPZLS
PRPGVZ
AFGANH
ZLSRPP
Reduce
AFGANHGVZPRPRPPZLS
Order By Sort By
Hive
Select: Order By e Sort By
SELECT stock_symbol, stock_volume, stock_price_close FROM financials.stockORDER BY stock_symbol ASC, stock_price_close DESC;
SELECT stock_symbol, stock_volume, stock_price_close FROM financials.stockSORT BY stock_symbol ASC, stock_price_close DESC;
Hive
Join
Hive supporta, come nei linguaggi SQL i JOIN.
Attenzione: sono supportati unicamente i Join di tipo equi-joins, quelli cioè dove l'unico operatore matematico accettato è l'uguaglianza matematica. Ad esempio:
● Inner JOIN● LEFT OUTER JOIN● RIGHT OUTER JOIN● FULL OUTER JOIN● LEFT SEMI JOIN● Cartesian Product JOIN
La documentazione completa è disponibile a questo indirizzo:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
Hive
Join: Inner Join
In un INNER JOIN vengono eliminati tutti i record che non corrispondono al criterio di matching desiderato
SELECT a.date, a.stock_price_close, b.stock_price_close FROM financials.stock a JOIN financials.stock bON a.date = b.dateWHERE a.stock_symbol = 'CLI' AND b.stock_symbol = 'CHP';
Hive
outer join
Pig supporta anche l' outer join. che consente di non scartare i record per cui non è
stata trovata una corrispondenza in una delle due tabelle, sostituendo la parte mancante con
dei null.
Gli outer join possono essere di tre tipi
● left → vengono inclusi i record della tabella a sinistra
● right → vengono inclusi i record della tabella a destra
● full → vengono inclusi i record di entrambe le tabelle
Hive
Join: LEFT OUTER JOIN
In questo JOIN vengono mostrati tutti i record della tabella a “sinistra” che corrispondono al vincolo imposto dalla clausola WHERE.Se i campi della tabella di “destra” non hanno valori che coincidono con il criterio specificato da ON allora viene inserito un NULL.
SELECT a.date, a.stock_symbol, a.stock_price_close, b.dividends FROM financials.stock a LEFT OUTER JOIN financials.dividends bON a.date = b.date AND a.stock_symbol = b.stock_symbol WHERE a.stock_symbol = 'CLI';
Hive
Join: RIGHT OUTER JOIN
In questo JOIN vengono mostrati tutti i record della tabella a “destra” che corrispondono al vincolo imposto dalla clausola WHERE.Se i campi della tabella di “sinistra” non ha valori che coincidono con il criterio specificato da ON allora viene inserito un NULL.
SELECT a.date, a.stock_symbol, a.stock_price_close, b.dividends FROM financials.dividends b RIGHT OUTER JOIN financials.stock aON a.date = b.date AND a.stock_symbol = b.stock_symbol WHERE a.stock_symbol = 'CLI';
Hive
Join: FULL OUTER JOIN
In questo JOIN vengono mostrati tutti i record di tutte le tabelle che corrispondono al vincolo imposto dalla clausola WHERE.Il valore NULL viene usato per i campi che non contengono un valore valido.
SELECT a.date, a.stock_symbol, a.stock_price_close, b.dividends FROM financials.dividends b FULL OUTER JOIN financials.stock aON a.date = b.date AND a.stock_symbol = b.stock_symbol WHERE a.stock_symbol = 'CLI';
Hive
Join: LEFT SEMI JOIN
In questo JOIN vengono mostrati tutti i record della tabella a “sinistra” se il record trovati nella tabella di destra soddisfano il predicato ON
SELECT a.date, a.stock_symbol, a.stock_price_close FROM financials.stock a LEFT SEMI JOIN financials.dividends bON a.date = b.date AND a.stock_symbol = b.stock_symbol;
Hive
Join: CARTESIAN PRODUCT JOIN
In questo JOIN tutte le tuple della tabella di sinistra vengono associate a tutte le tuple della tabella di destra.In questo modo se la tabella di sinistra ha 5 righe e quella di destra ha 6 righe. Il risultato è di 30 righe.
Corrisponde a realizzare un INNER JOIN senza però l'utilizzo del predicato ON
SELECT * FROM financials.stock a JOIN financials.stock bWHERE a.stock_symbol = b.stock_symbol AND a.stock_symbol = 'AXE';