【问题标题】:how do retrieve specific row in Hive?如何检索 Hive 中的特定行?
【发布时间】:2015-06-01 04:22:53
【问题描述】:

我有一个如下所示的数据集:

---------------------------
 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 的新手,我现在不会忽略其他所有内容,直到我到达下一个类别的项目,同时我仍然保持上一个类别中最便宜的价格。

【问题讨论】:

  • 你能否提供一个预期输出的例子,具体来说,你的意思是“如何在我到达下一个项目类别之前忽略其他所有内容,同时我仍然保持上一个类别中最便宜的价格”?
  • 在我阅读了第一行并记住了 2.5 之后,我想遍历这些行直到我找到下一个类别 pear 在这种情况下为 pear 并比较价格,然后从 pear 中记住 1.2 并再次遍历直到我找到下一项并做同样的事情。
  • 那么您想为每个客户添加一个min(cost) 列吗? cat 列不相关,对吧?
  • 接受的答案在技术上是正确的,但在给出替代方案时效率非常低。

标签: hadoop hive hiveql


【解决方案1】:

你可以像下面这样使用:

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

【讨论】:

    【解决方案2】:

    鉴于您在 Hive 中的选择(brickhouse UDFshive windowing functions 或自联接),自联接是执行此操作的最差方式。

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

    【讨论】:

      【解决方案3】:

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

      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 中应该可以正常工作。

      【讨论】:

      • 这需要 2 个 MR 作业。
      【解决方案4】:

      我认为这实际上是一个 SQL 问题,而不是 Hive 问题:如果您只想为每位客户提供最便宜的成本,您可以这样做

      select cust, min(cost)
      group by cust
      

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

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

      【讨论】:

        猜你喜欢
        • 2017-02-13
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多