2015-07-10 17 views
5

non riesco a capire come mi occupo di questo problema:Hive - COME Operatore

Questi sono i miei dati:

Table1:   Table2: 
BRAND   PRODUCT   SOLD 
Sony   Sony ABCD   1233 
Apple   Sony adv   1233 
Google   Sony aaaa   1233 
IBM    Apple 123   1233 
etc.   Apple 345   1233 
       IBM 13123   1233 

E 'possibile filtrare la query che ho una tabella in cui si trova la marchio e il totale delle vendite? La mia idea è:

Select table1.brand, sum(table2.sold) from table1 
join table2 
on (table1.brand LIKE '%table2.product%') 
group by table.1.brand 

Quella era la mia idea, ma ottengo sempre un errore

Il problema più grande è il Like-operatore o c'è qualche altra soluzione?

+0

http://stackoverflow.com/questions/40628396/hive-like-operator Si prega di controllare e consigliare per sopra Quear simile. Grazie –

risposta

7

Vedo due problemi: prima di tutto, i JOIN in hive funzionano solo con condizioni di uguaglianza, che come non funzioneranno in questo caso.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

Solo uguaglianza join join esterni, e semi sinistra join sono supportati in alveare. Hive non supporta condizioni di join che non sono condizioni di uguaglianza in quanto è molto difficile esprimere condizioni come una mappa/ridurre il lavoro.

Invece, questo vuole entrare in una clausola where.

In secondo luogo, vedo anche un problema con la stessa dichiarazione: '% table2.product%' viene interpretato come letteralmente la stringa '% table2.product%'. Inoltre, anche se questo stava facendo ciò che era previsto, proverebbe a cercare table2.product all'interno del brand, quando sembra che lo desideri nell'altro modo. Per ottenere la valutazione desiderata, è necessario aggiungere il carattere jolly al contenuto di table1.brand; per realizzare questo, vuoi concatenare i tuoi caratteri jolly nella tua espressione.

table2.product LIKE concat('%',table1.brand,'%')) 

In questo modo, il vostro simile valuterà per '% Sony%' stringhe, '% di Apple%' ... ecc invece di '% table2.product%'.

quello che vuoi è di query di Brandon Bell, che ho fuse in questa risposta:

SELECT table1.brand, SUM(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 
4

si dovrebbe essere in grado di realizzare questo senza un JOIN. Vedere la seguente query:

SELECT table1.brand, sum(table2.sold) 
FROM table1, table2 
WHERE table2.product LIKE concat('%', table1.brand, '%') 
GROUP BY table1.brand; 

Ciò restituisce

Apple 2466 
IBM  1233 
Sony 3699 

Dove i miei file di input sono i seguenti:

Sony 
Apple 
Google 
IBM  

e

Sony ABCD  1233 
Sony adv  1233 
Sony aaaa  1233 
Apple 123  1233 
Apple 345  1233 
IBM 13123  1233 
+0

Giusto per chiarire che un'unione implicita è un join. Per quanto riguarda le prestazioni dovrebbero essere uguali. "FROM a, b WHERE a.ID = b.ID" è zucchero sintattico per "FROM a JOIN b ON a.ID = b.ID". :) – invoketheshell

+0

Grazie per il chiarimento. –