【问题标题】:select top 10 items per city in SparkSQL在 SparkSQL 中选择每个城市的前 10 个项目
【发布时间】:2016-05-26 15:32:25
【问题描述】:

我有下表 SQL 表 (SparkSQL)。

user_id, city, timestamp, item_id

我需要在每个给定日期找到给定城市的前 10 个项目(根据 item_id 在该城市出现的次数)。

然后我做了以下事情:

SELECT   * 
FROM     ( 
                SELECT *, 
                       row_number() OVER partition BY city AS rn 
                FROM   mytable) AS foo 
ORDER BY rn DESC

但是,尽管它按 rn 排序,但它并不仅仅是给我一个给定日期的前 10 个元素。解决此问题的正确方法是什么?谢谢!

【问题讨论】:

  • of the given city in each given date 表示您必须按城市、日期进行分区(1 个日期可能有超过 1 个时间戳吗?)。 Top 10 表示您必须order by something 才能获得前 10 项。您想订购什么东西
  • 假设是交易记录,item_1可能出现1000次,item_2可能出现950次......在给定的城市。我希望它按每个项目出现在该城市的次数排序。 IE。对于每个日期,我想展示每个城市最畅销的 10 件商品。

标签: sql apache-spark


【解决方案1】:

不知道从 spark 中的时间戳 TRUNC 时间的函数是什么。

但首先你需要计算计数,然后是row_number

SELECT *
FROM (
        SELECT   city, item_id, theDATE, cnt,
                 ROW_NUMBER() OVER (PARTITION BY city, theDATE
                                    ORDER BY cnt) rn             
        FROM     (SELECT city,
                         timestamp,
                         item_id,
                         to_date(timestamp) as theDATE, -- remove time and leave just date.
                         COUNT(item_id) OVER (PARTITION BY city,  to_date(timestamp)) cnt
                  FROM   mytable
                 ) AS foo 
     ) AS boo
WHERE rn <= 10
ORDER BY city, theDATE, rn

【讨论】:

  • 截断时间的函数是to_date(...)
猜你喜欢
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多