web-dev-qa-db-fra.com

Hive - Opérateur LIKE

Je ne peux pas comprendre comment je traite ce problème:

Ce sont mes données:

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

Est-il possible de filtrer la requête que j'ai une table où se trouve la marque et le total des ventes? Mon idée est:

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

C'était mon idée, mais j'ai toujours une erreur

Le plus gros problème est le Like-Operator ou existe-t-il une autre solution?

8
Daniel

Je vois deux problèmes: Tout d'abord, les JOIN dans Hive ne fonctionnent qu'avec des conditions d'égalité, qui ne fonctionneront pas là-bas.

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

Seules les jointures d'égalité, les jointures externes et les semi-jointures gauches sont prises en charge dans Hive. Hive ne prend pas en charge les conditions de jointure qui ne sont pas des conditions d'égalité car il est très difficile d'exprimer des conditions telles qu'un travail de mappage/réduction.

Au lieu de cela, cela veut aller dans une clause where.

Deuxièmement, je vois également un problème avec l'instruction similaire elle-même: '% table2.product%' est interprété comme littéralement la chaîne '% table2.product%'. De plus, même si cela faisait ce qui était prévu, il essaierait de rechercher le produit table2.product à l'intérieur de la marque, lorsque vous semblez le vouloir dans l'autre sens. Pour obtenir l'évaluation souhaitée, vous devez ajouter le caractère générique au contenu de table1.brand; pour ce faire, vous souhaitez concaténer vos caractères génériques dans votre expression.

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

En faisant cela, votre like évaluera les chaînes '% Sony%', '% Apple%' ... etc au lieu de '% table2.product%'.

Ce que vous voulez, c'est la requête de Brandon Bell, que j'ai fusionnée dans cette réponse:

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

Vous devriez pouvoir accomplir cela sans JOIN. Voir la requête suivante:

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

Cela revient

Apple   2466
IBM     1233
Sony    3699

Où mes fichiers d'entrée sont les suivants:

Sony
Apple
Google
IBM    

et

Sony ABCD       1233
Sony adv        1233
Sony aaaa       1233
Apple 123       1233
Apple 345       1233
IBM 13123       1233
6
brandon.bell