1

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関数を使用してこのテーブルを結合して最新のレコードを取得しようとしましたが、機能し、数秒で終了しますが、私のユースケースにはまだ遅すぎます. また、ウィンドウ関数を削除すると、述語が押し下げられ、ミリ秒単位で返されます。

誰かに何かアイデアがあれば、それは大歓迎です。

4

2 に答える 2

1

興味のある方のために、この質問を Hortonworks コミュニティ フォーラムに投稿しました。向こうの善良な人たちは、Hive Jira でこの問題のバグを提起し、積極的に取り組んでいます。

https://community.hortonworks.com/questions/8880/hive-on-tez-pushdown-predicate-doesnt-work-in-part.html

https://issues.apache.org/jira/browse/HIVE-12808

于 2016-01-08T22:33:06.440 に答える
0

これは予期される動作です。全テーブル スキャンを回避するには、このような where 条件を適用する必要があります (ビューを使用することはできません)。これは、ほとんどのデータベースの制限です。内部で一時テーブルを作成するため、分析関数はデータがフィルター処理された後に適用されることになっています。

WITH t1 AS (
  SELECT *, ROW_NUMBER() OVER ( PARTITION BY regionid, id, deviceid order by ts desc) AS rownos FROM positions **<where condition>**
)
SELECT *
FROM t1
WHERE rownos = 1; 
于 2016-01-06T01:01:02.203 に答える