0

これは私のTable1の下のデータです

BID           PID                       TIME
---------+-------------------+----------------------
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:40:29
1345653       330760137950       2012-07-09 21:41:29
1345653       110909316904       2012-07-09 21:29:06
1345653       221065796761       2012-07-09 19:31:48

したがって、上記のシナリオを明確にする必要がある場合-上記の表に次のようなデータがあります-USERの場合1345653、このPID330760137950 four timesがありますが、タイムスタンプが異なります。だから私はこのような出力が必要です-

私が必要とする出力:-

1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:41:29
1345653       110909316904       2012-07-09 21:29:06
1345653       221065796761       2012-07-09 19:31:48

したがって、基本的BIDに とPIDが同じであるが異なる場合timestamps、 TIME で降順でソートされた上位 3 つが必要です。

rank UDFこのために、Hive で (ユーザー定義関数)を作成しました。そして、私は以下のクエリを書きましたが、うまくいきません。誰でもこれについて私を助けることができますか?

SELECT bid, pid, rank(bid), time, UNIX_TIMESTAMP(time)
FROM (
    SELECT bid, pid, time
    FROM table1
    where to_date(from_unixtime(cast(UNIX_TIMESTAMP(time) as int))) = '2012-07-09'
    DISTRIBUTE BY bid,pid
    SORT BY bid, time desc
) a
WHERE rank(bid) < 3;

したがって、上記のクエリでは、次のような出力が得られます

1345653       330760137950       2012-07-09 21:43:29
1345653       330760137950       2012-07-09 21:42:29
1345653       330760137950       2012-07-09 21:41:29

上記の最後の2行が欠落しているため、これは間違っていExpected Outputます。誰でもこれで私を助けることができますか?

4

1 に答える 1

1
select bid, pid, [time] from (
    select bid, pid, [time], rank() over (partition by bid, pid order by [time] desc) as k 
    from #temp ) as x 
where k  <=3
order by bid, pid, time desc 

ああ、私はSQLサーバーにいます。私はあなたがいるとは思わない........

とりあえず。私のお勧めは、ネストされた select の中にランク関数を移動することです。外側の選択で、3 未満の場所を選択します...構文がわかりません。この質問に答えるべきではなかった。ごめんなさい....笑

ここ: http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/ あなたの rank() は外側の選択にあります...必要です内側にいること。ただし、< 4 または <= 3 などは外側の where ステートメントに残します。あなたのクエリは、その例とほぼ同じように見えます...いくつかの変更が必要です。

リンクとHiveに関する私の絶対的な知識不足に基づいて...私はあなたがこれを望むかもしれないと思います:

SELECT bid, pid, time
FROM (
    SELECT bid, pid, rank(time) as rank, time
    FROM $compTable 
    DISTRIBUTE BY bid, pid
    SORT BY bid, pid, time desc
) a
WHERE rank < 4
ORDER BY bid, pid, time desc

正直なところ、質問を投稿する前にハイブが何であるかわからなかったので、テストもコンパイルもできません。(小さな世界、私は知っている、とても悲しい - とても本当)

于 2012-07-19T21:27:31.417 に答える