2

フォームのトランザクションデータを含むハイブテーブルがあります (非常に単純化されています)

id  Status  Value   UpdatedTimeStamp

515 Open    1   2014-05-08T11:43:27
516 Open    NULL    2014-05-08T11:43:27
515 Answered    1   2014-05-09T11:43:27 
515 Closed  NULL    2014-05-10T11:43:27
517 Open    NULL    2014-05-09T11:43:27
516 Closed  NULL    2014-05-09T11:43:27

私のユースケースでは、タイムスタンプでソートしたときに、その特定の ID の列の最後の非 NULL 値として列エントリを持つ一意の ID を含む出力テーブルが必要です。

したがって、望ましい出力は次のとおりです。

id  Status  Value   UpdatedTimeStamp

515 Closed  1   2014-05-10T11:43:27
516 Closed  NULL    2014-05-09T11:43:27
517 Open    NULL    2014-05-09T11:43:27

パーティションでウィンドウ関数を使用してそれを達成しようとしています

INSERT OVERWRITE TABLE testSample2 SELECT id, FIRST_VALUE (Status) OVER SortedData, FIRST_VALUE (Value IGNORE NULLS) OVER SortedData, FIRST_VALUE (UpdatedTimeStamp) OVER SortedData FROM testSample WINDOW SortedData (PARTITION BY id ORDER BY UpdatedTimeStamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);

これにより、NullPointerException が発生します (おそらく、IGNORE NULLS は Hive ではまだサポートされていません)。NULL 以外の最後の値を取得する方法を教えてください。

4

1 に答える 1

1

次のようなものを使用してみてください。

select ss.vl1, FIRST_VALUE(ss.ky) OVER (PARTITION BY ss.vl1 ORDER BY ss.nl, ss.vl rows unbounded preceding) 
FROM (
    SELECT IF(s.vl=123456, 'sasa', 'AAAAAA') as vl1, s.vl, s.ky, IF(s.ky IS NULL, 1, 0) as nl
    FROM (
        select explode(map(NULL, 123, 1, 1234, 2, 12345, 3, 123456)) as (ky, vl) from default.dual) s ) ss;
vl1     _wcol0
AAAAAA  1
AAAAAA  1
AAAAAA  1
sasa    3
于 2015-03-11T12:44:42.003 に答える