无法在 sparksql 中选择每组前 10 条记录

新手上路,请多包涵

嗨,我是 spark sql 的新手。我有一个这样的数据框。

   ---+----------+----+----+----+------------------------+
 |tag id|timestamp|listner| orgid |org2id|RSSI
 +---+----------+----+----+----+------------------------+
 |  4|1496745912| 362|   4|   3|                    0.60|
 |  4|1496745924|1901|   4|   3|                    0.60|
 |  4|1496746030|1901|   4|   3|                    0.60|
 |  4|1496746110| 718|   4|   3|                    0.30|
 |  2|1496746128| 718|   4|   3|                    0.60|
 |  2|1496746188|1901|   4|   3|                    0.10|

我想在 spark sql 中为每个列表器选择前 10 个时间戳值。

我尝试了以下查询。它会引发错误。

   val avg = sqlContext.sql("select top 10 * from avg_table") // throws error.

  val avg = sqlContext.sql("select rssi,timestamp,tagid from avg_table order by desc limit 10")  // it prints only 10 records.

我想为每个需要获取前 10 个时间戳值的侦听器选择。任何帮助将不胜感激。

原文由 Teju Priya 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这不行吗?

 select rssi, timestamp, tagid
from avg_table
order by timestamp desc
limit 10;

编辑:

哦,我明白了。你想要 row_number()

 select rssi, timestamp, tagid
from (select a.*,
             row_number() over (partition by listner order by timestamp desc) as seqnum
      from avg_table
     ) a
where seqnum <= 10
order by a.timestamp desc;

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里我们也可以使用dense_rank

 select *
from (select *,
             dense_rank() over (partition by listner order by timestamp) as rank
      from avg_table
     )
where rank <= 10;

dense_rank()row_number() 之间的区别是dense_rank() 为匹配列提供相同的排名/编号[ 在分区完成 时] 多行中的值,其中 row_number() 为多个匹配列值提供唯一的行号/排名排

谢谢

原文由 bajran 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进