hive-like操作符

shstlldc  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(504)

我不知道该怎么处理这个问题:
这是我的数据:

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

是否可以过滤查询,我有一个表,其中代表品牌和总solds?我的想法是:

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

那是我的主意,但我总是出错
最大的问题是like操作符还是有其他解决方案?

mspsb9vt

mspsb9vt1#

我看到了两个问题:首先,Hive中的连接只在平等条件下工作,而like在那里不起作用。
https://cwiki.apache.org/confluence/display/hive/languagemanual+joins
配置单元中仅支持相等联接、外部联接和左半联接。配置单元不支持非相等条件的联接条件,因为很难将此类条件表示为map/reduce作业。
相反,这需要加入where子句。
其次,我还发现like语句本身有问题:“%table2.product%”被解释为字符串“%table2.product%”。此外,即使这样做是为了达到预期的效果,它也会试图寻找品牌内部的table2.product,而你似乎想从另一个Angular 来寻找它。要获得您想要的评估,您需要在table1.brand的内容中添加通配符;为此,您需要将通配符连接到表达式中。

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

这样,like将计算字符串“%sony%”、“%apple%”……等,而不是“%table2.product%”。
你想要的是brandon bell的问题,我把它合并到这个答案中:

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

bnlyeluc2#

你应该能够做到这一点,没有一个连接。请参见以下查询:

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

相关问题