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?
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;
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