无法在sparksql中选择前10个记录

时间:2017-07-05 10:16:15

标签: sql apache-spark-sql

嗨,我是新来的火花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中的每个listner前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个时间戳值。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

这不起作用吗?

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;

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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()为多行中的匹配列值提供唯一的行号/等级

由于