如何检索Hive中的特定行?

时间:2015-06-01 04:22:54

标签: hadoop hive hiveql

我的数据集如下所示:

---------------------------
 cust | cost | cat   | name
---------------------------
  1   |  2.5 | apple | pkLady
---------------------------
  1   |  3.5 | apple | greenGr
---------------------------
  1   |  1.2 | pear  | yelloPear
----------------------------
  1   |  4.5 | pear  |  greenPear
-------------------------------

我的配置单元查询现在应该比较客户购买的每件商品的最便宜价格。所以我现在想要将2.5和1.2放在一行中以获得它的不同。由于我是Hive的新手,我现在不知道如何忽略其他所有内容,直到我达到下一类别的项目,而我仍然保持在上一类别中最便宜的价格。

4 个答案:

答案 0 :(得分:2)

你可以使用如下:

select cat,min(cost) from table group by cost; 

答案 1 :(得分:2)

根据您在Hive中的选项(brickhouse UDFshive windowing functions或自我加入),自我加入是执行此操作的最差方式。

select *
  , (cost - min(cost) over (partition by cust)) cost_diff
from table

答案 2 :(得分:1)

您可以创建一个子查询,其中包含每个客户的最低成本,然后将其加入原始表:

select
    mytable.*,
    minCost.minCost,
    cost - minCost as costDifference
from mytable
inner join
    (select
       cust,
       min(cost) as minCost
    from mytable
    group by cust) minCost
on mytable.cust = minCost.cust

我使用MySQL创建了一个interactive SQLFiddle example,但它在Hive中应该可以正常工作。

答案 3 :(得分:1)

我认为这确实是一个SQL问题,而不是一个Hive问题:如果你只想要每个客户最便宜的成本,你可以做到

select cust, min(cost)
group by cust

否则,如果您希望每个类别的每个客户的成本最低,您可以这样做:

select cust, cat, min(cost)
from yourtable
groupby cust, cat