2015-07-10 21 views
5

tôi không thể tìm ra cách tôi đối phó với vấn đề đó:Hive - như nhà điều hành

Đây là những dữ liệu của tôi:

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 

Có thể lọc các truy vấn mà tôi có một bảng ở đâu là viết tắt của thương hiệu và tổng số bán? Ý tưởng của tôi là:

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

Đó là ý tưởng của tôi, nhưng tôi luôn luôn nhận được một lỗi

Vấn đề lớn nhất là Like-điều hành hoặc là có bất kỳ giải pháp nào khác không?

+0

http://stackoverflow.com/question/40628396/hive-like-operator Vui lòng kiểm tra và tư vấn cho trên cùng Quear. Cảm ơn bạn –

Trả lời

7

Tôi thấy hai vấn đề: Trước hết, JOINs trong hive chỉ hoạt động với các điều kiện bình đẳng, điều đó sẽ không hoạt động ở đó.

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

Chỉ bình đẳng tham gia, ngoài tham gia, và bán lại tham gia được hỗ trợ trong Hive. Hive không hỗ trợ các điều kiện tham gia không phải là điều kiện bình đẳng vì rất khó thể hiện các điều kiện như là một công việc bản đồ/giảm thiểu.

Thay vào đó, điều đó muốn đi vào mệnh đề where.

Thứ hai, tôi cũng thấy một vấn đề với chính tuyên bố như vậy: '% table2.product%' đang được hiểu theo nghĩa đen là chuỗi '% table2.product%'. Ngoài ra, ngay cả khi điều này đã làm những gì đã được dự định, nó sẽ cố gắng tìm table2.product bên trong của thương hiệu, khi bạn dường như muốn nó theo cách khác. Để có được đánh giá bạn dự định, bạn cần phải thêm ký tự đại diện vào nội dung của table1.brand; để thực hiện điều này, bạn muốn ghép các ký tự đại diện của bạn vào biểu thức của bạn.

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

Bằng cách này, bạn sẽ đánh giá cho chuỗi '% Sony%', '% Apple%' ... vv thay vì '% table2.product%'.

gì bạn muốn là truy vấn Brandon Bell, mà tôi đã sáp nhập vào câu trả lời này:

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

Bạn sẽ có thể thực hiện điều này mà không có một JOIN. Xem các truy vấn sau đây:

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

này trả

Apple 2466 
IBM  1233 
Sony 3699 

đâu tập tin đầu vào của tôi là như sau:

Sony 
Apple 
Google 
IBM  

Sony ABCD  1233 
Sony adv  1233 
Sony aaaa  1233 
Apple 123  1233 
Apple 345  1233 
IBM 13123  1233 
+0

Chỉ cần làm rõ rằng một tham gia ngầm định là một tham gia. Hiệu suất khôn ngoan họ nên giống nhau. "FROM a, b WHERE a.ID = b.ID" là cú pháp đường cho "FROM a JOIN b ON a.ID = b.ID". :) – invoketheshell

+0

Cảm ơn bạn đã làm rõ. –