2015-07-10 3 views
5

Я не могу понять, как я справляюсь с этой проблемой: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 

Это была моя идея, но я всегда получаю ошибку

Самая большая проблема заключается в Как-оператора или есть другое решение?

+0

http://stackoverflow.com/questions/40628396/hive-like-operator Пожалуйста, проверьте и сообщите для выше подобных Quear. Спасибо –

ответ

7

Я вижу два вопроса: Прежде всего, ПРИСОЕДИНИТЕСЬ в улье работают только с условиями равенства, которые вроде бы там не работают.

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

только соединяет равенство, внешние соединения, и оставил пол объединений поддерживаются в улье. Улей не поддерживает условия соединения, которые не являются условиями равенства, так как очень сложно выразить такие условия, как работа с картой/уменьшением.

Вместо этого он хочет войти в предложение where.

Во-вторых, я также вижу проблему с аналогичным утверждением: «% table2.product%» интерпретируется буквально как строка «% table2.product%». Кроме того, даже если бы это делало то, что предназначалось, оно попыталось бы найти table2.product внутри бренда, когда вам кажется, что это нужно другим способом. Чтобы получить оценку, которую вы планировали, вам нужно добавить шаблон к содержимому table1.brand; Чтобы достичь этого, вы хотите объединить свои подстановочные знаки в свое выражение.

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

Делая это, ваш, как будет оценивать для '% Sony%' струнные, '% Apple,%' ... и т.д. вместо '% table2.product%'.

Что вы хотите запрос Брэндон Белла, который я слился в этот ответ:

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

Вы должны быть в состоянии сделать это без 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 
+0

Просто, чтобы уточнить, что неявное объединение - это объединение. Производительность должна быть одинаковой. «FROM a, b WHERE a.ID = b.ID» является синтаксическим сахаром для «FROM a JOIN b ON a.ID = b.ID». :) – invoketheshell

+0

Спасибо за разъяснение. –

Смежные вопросы