web-dev-qa-db-ja.com

Hive-LIKEオペレーター

私はその問題にどのように対処するか理解できません:

これは私のデータです:

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ですか、それとも他のソリューションがありますか?

8
Daniel

次の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;
11

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
6
brandon.bell