如何检索 Hive 中的特定行?
how do retrieve specific row in Hive?
我的数据集如下所示:
---------------------------
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 的新手,我现在不知道如何忽略其他所有内容,直到我到达下一个类别的项目,同时我仍然保持上一个类别中的最便宜价格。
您可以创建一个包含每个客户的最低成本的子查询,然后将其加入到原始 table:
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 中应该可以正常工作。
我认为这确实是一个 SQL 问题,而不是 Hive 问题:如果您只想让每个客户的成本最低,您可以这样做
select cust, min(cost)
group by cust
否则,如果您希望每个类别的每个客户成本最低,您可以这样做:
select cust, cat, min(cost)
from yourtable
groupby cust, cat
您可以像下面这样使用:
select cat,min(cost) from table group by cost;
考虑到您在 Hive 中的选择(brickhouse UDFs, hive windowing functions 或自连接),自连接是最差 的方法。
select *
, (cost - min(cost) over (partition by cust)) cost_diff
from table
我的数据集如下所示:
---------------------------
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 的新手,我现在不知道如何忽略其他所有内容,直到我到达下一个类别的项目,同时我仍然保持上一个类别中的最便宜价格。
您可以创建一个包含每个客户的最低成本的子查询,然后将其加入到原始 table:
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 中应该可以正常工作。
我认为这确实是一个 SQL 问题,而不是 Hive 问题:如果您只想让每个客户的成本最低,您可以这样做
select cust, min(cost)
group by cust
否则,如果您希望每个类别的每个客户成本最低,您可以这样做:
select cust, cat, min(cost)
from yourtable
groupby cust, cat
您可以像下面这样使用:
select cat,min(cost) from table group by cost;
考虑到您在 Hive 中的选择(brickhouse UDFs, hive windowing functions 或自连接),自连接是最差 的方法。
select *
, (cost - min(cost) over (partition by cust)) cost_diff
from table