查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法

Posted

技术标签:

【中文标题】查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法【英文标题】:More efficient way to query shortest string value associated with each value in another column in Hive QL 【发布时间】:2018-04-27 13:56:41 【问题描述】:

我在 Hive 中有一个表,其中包含商店名称、订单 ID 和用户 ID(以及其他一些列,包括项目 ID)。对于购买的每件商品,表格中都有一行(因此,如果订单包含多个商品,则每个订单可以有不止一行)。订单 ID 在商店内是唯一的,但在商店之间不是唯一的。一个订单可以有多个关联的用户 ID。

我正在尝试编写一个查询,该查询将返回所有商店和订单 ID 的列表以及与每个订单关联的最短用户 ID。

因此,例如,如果数据如下所示:

 STORE | ORDERID | USERID | ITEMID
 ------+---------+--------+-------
|  a   |    1    |  bill  |  abc  |
|  a   |    1    |  susan |  def  |
|  a   |    2    |  jane  |  abc  |
|  b   |    1    |  scott |  ghi  |
|  b   |    1    |  tony  |  jkl  |

然后输出将如下所示:

 STORE | ORDERID | USERID 
 ------+---------+-------
   a   |    1    |  bill 
   a   |    2    |  jane 
   b   |    1    |  tony 

我已经编写了一个可以执行此操作的查询,但我觉得必须有一种更有效的方法来解决它。有人知道产生这些结果的更好方法吗?

这是我目前所拥有的:

select 
    users.store, users.orderid, users.userid
from 
    (select 
         store, orderid, userid, length(userid) as len 
     from 
         sales) users
join 
    (select distinct 
         store, orderid, 
         min(length(userid)) over (partition by store, orderid) as len 
     from 
         sales) len on users.store = len.store
                    and users.orderid = len.orderid
                    and users.len = len.len

【问题讨论】:

【参考方案1】:

检查一下这可能对您有用,在这里您可以实现单个“SELECT”子句的目标,而无需额外的 SQL 开销。

select distinct 
    store, orderid, 
    first_value(userid) over(partition by store, orderid order by length(userid) asc) f_val 
from 
    sales;

结果将是:

store   orderid    f_val
a       1          bill
a       2          jane
b       1          tony

【讨论】:

谢谢!我尝试了下面建议的 rank() 解决方案,这比我原来的解决方案更快。但这比这还要快。 我做了,但它没有公开显示,因为不幸的是我的声望不到 15。【参考方案2】:

可能rank()是最好的办法:

select s.*
from (select s.*, rank() over (partition by store order by length(userid) as seqnum
      from sales s
     ) s
where seqnum = 1;

【讨论】:

以上是关于查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mySQL 返回另一列中每个值的最常见列值?

获取 SQL 中另一列的每个值的最常见值

如果同一行中另一列中的值匹配,如何比较列的两个值

如何计算包含一组列中的值和 Pandas 数据框中另一列中的另一个值的行数?

我如何基于Awk中另一列中的值求和列中的值

使用同一 Dataframe 中另一列的 int 作为索引获取列中的列表值