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

Posted

技术标签:

【中文标题】无法在 sparksql 中选择每组前 10 条记录【英文标题】:unable to select top 10 records per group in sparksql 【发布时间】:2017-07-05 10:16:15 【问题描述】:

您好,我是 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 个时间戳值的侦听器选择。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这不行吗?

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;

【讨论】:

对于我需要记录的每个列表值都没有...所以它不会工作 @TejuPriya 。 . .只是一种不必列出子查询中所有列的方法。【参考方案2】:

这里我们也可以使用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() 提供唯一的行号/排名以匹配多行中的列值

谢谢

【讨论】:

【参考方案3】:

在查询中使用“限制”。 (在你的情况下限制 10 个)

EXAMPLE: sqlContext.sql("SELECT text FROM yourTable LIMIT 10")

或者您可以从表中选择所有结果并将结果保存到 DataFrame 或 DataSet (或 RDD,但随后您需要调用 rdd.toDS() 或 DF() 方法) 然后你可以调用 show(10) 方法。

【讨论】:

对于每个listner,我需要前10条记录。所以上面的查询不起作用

以上是关于无法在 sparksql 中选择每组前 10 条记录的主要内容,如果未能解决你的问题,请参考以下文章

每组前 N 个(MSSQL)[重复]

选择每组前 N 个项目 ms-Access - MORE "Ns"

每组前 3 名,包括 0

优化获取每组前 n 条记录的方法

MySQL 分组后取每组前N条数据

sql分组后取每组前三