私はその問題にどのように対処するか理解できません:
これは私のデータです:
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
ブランドと売り上げ合計を表すテーブルがあるというクエリをフィルタリングすることは可能ですか?私のアイデアは:
Select table1.brand, sum(table2.sold) from table1
join table2
on (table1.brand LIKE '%table2.product%')
group by table.1.brand
それは私のアイデアでしたが、常にエラーが発生します
最大の問題は、Like-Operatorですか、それとも他のソリューションがありますか?
次の2つの問題があります。まず、HiveのJOINは平等条件でのみ機能しますが、そのような状況では機能しません。
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+Joins
Hiveでは、等価結合、外部結合、および左半結合のみがサポートされています。 Hiveは、等号条件ではない結合条件をサポートしません。これは、map/reduceジョブなどの条件を表現するのが非常に難しいためです。
代わりに、where句に進みたいと考えています。
次に、likeステートメント自体に問題があります。「%table2.product%」は文字列「%table2.product%」として解釈されています。さらに、これが意図したことを行っていたとしても、別の方法でそれが必要な場合は、ブランド内のtable2.productを検索しようとします。意図した評価を取得するには、table1.brandのコンテンツにワイルドカードを追加する必要があります。これを実現するには、ワイルドカードを式に連結します。
table2.product LIKE concat('%',table1.brand,'%'))
これにより、「%table2.product%」ではなく、「%Sony%」、「%Apple%」...などの文字列を評価します。
あなたが欲しいのは、私がこの答えにマージしたブランドンベルのクエリです:
SELECT table1.brand, SUM(table2.sold)
FROM table1, table2
WHERE table2.product LIKE concat('%', table1.brand, '%')
GROUP BY table1.brand;
JOINなしでこれを達成できるはずです。次のクエリを参照してください。
SELECT table1.brand, sum(table2.sold)
FROM table1, table2
WHERE table2.product LIKE concat('%', table1.brand, '%')
GROUP BY table1.brand;
これは戻ります
Apple 2466
IBM 1233
Sony 3699
入力ファイルは次のとおりです。
Sony
Apple
Google
IBM
そして
Sony ABCD 1233
Sony adv 1233
Sony aaaa 1233
Apple 123 1233
Apple 345 1233
IBM 13123 1233