2017-07-05 34 views
0

こんにちは、私はスパークSQLの新しいです。私はこのようなデータフレームを持っています。sparksqlで上位10個のレコードを選択できません

---+----------+----+----+----+------------------------+ 
|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; 

EDIT:

ああ、私はそれを得ます。あなたが欲しい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; 
+0

私は記録する必要があるすべてのリスナーの価値はありません...だからそれはうまく動作しません –

+0

a。*は何ですか?上記のコードで.. –

+0

@ TeePriya。 。 。サブクエリ内のすべての列をリストする必要がないようにするだけの方法です。 –

0

"limit"をクエリに使用します。 ()やDFに

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

(お使いの場合には10を制限する)またはあなたのテーブルからすべてを選択して、データフレームまたはデータセット (またはRDDにつながる保存することができますが、その後、あなたはrdd.toDSを(呼び出す必要があります)メソッド) 次にshow(10)メソッドを呼び出すことができます。

+0

すべてのリスナーのために、私はトップ10のrecords.So上記のクエリdoesnt仕事が必要 –

0

ここでは、DENSE_RANK()ROW_NUMBER()が(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()として一意の行番号/順位を指定します。

ありがとう

関連する問題