Hive on Tez を使用して、このビューに対してこのクエリを実行すると、regionid と id にパーティションがある場合でも、フル テーブル スキャンが発生します。Cloudera Impala でのこのクエリの完了には 0.6 秒かかり、Tez で Hortonworks Data Platform と Hive を使用すると 800 秒かかります。Hive on Tez では、ウィンドウ関数を使用すると、述語が内部選択にプッシュされるのを防ぎ、完全なテーブル スキャンが発生するという結論に達しました。
CREATE VIEW latestposition AS
WITH t1 AS (
SELECT *, ROW_NUMBER() OVER ( PARTITION BY regionid, id, deviceid order by ts desc) AS rownos FROM positions
)
SELECT *
FROM t1
WHERE rownos = 1;
SELECT * FROM latestposition WHERE regionid='1d6a0be1-6366-4692-9597-ebd5cd0f01d1' and id=1422792010 and deviceid='6c5d1a30-2331-448b-a726-a380d6b3a432';
MAX関数を使用してこのテーブルを結合して最新のレコードを取得しようとしましたが、機能し、数秒で終了しますが、私のユースケースにはまだ遅すぎます. また、ウィンドウ関数を削除すると、述語が押し下げられ、ミリ秒単位で返されます。
誰かに何かアイデアがあれば、それは大歓迎です。