2016-08-06 11 views
0

私はCDHクラスタ上のデータセットを持っており、それはyyyymmによってパーティション化されています。ハイブのパーティション

私はハイブで以下のクエリを実行します。

select actvydt, cast((concat(trim(substr(ActvyDt, 1, 4)), trim(substr(ActvyDt, 6, 2)))) as int) from pos where yyyymm=201601 and actvydt>='2016-01-01' and actvydt<='2016-01-09' limit 10; 

それは、データセットから201601の右のパーティションに当たっているが。以下は

は結果である:

select actvydt,cast((concat(trim(substr(ActvyDt, 1, 4)), trim(substr(ActvyDt, 6, 2)))) as int) from pos.pos_sales_weekly where yyyymm=cast(trim((concat(trim(substr(ActvyDt, 1, 4)), trim(substr(ActvyDt, 6, 2))))) as int) and actvydt>='2016-01-01' and actvydt<='2016-01-09' limit 10; 

これは、データセット全体に当たっている(ただSUBSTとconcat関数を通じてYYYYMMのためのパラメータを渡す):

actvydt  yyyymm 
2016-01-02 201601 
2016-01-02 201601 
2016-01-02 201601 

しかし、私は、以下のクエリを実行すると。したがって、yyyymmの値は正しく渡されません。そここの機能を持ついくつかの問題です:

cast((concat(trim(substr(ActvyDt, 1, 4)), trim(substr(ActvyDt, 6, 2)))) as int) 

は、しかし、関数の値は、列として渡され、上記の結果で見ることができます。これは正しいパラメータ201601を示しています。 どんな助けも非常に高いでしょう。パーティション・プルーニングが動作するために CREATE EXTERNAL TABLE IF NOT EXISTS pos (nid bigint, actvydt date, upc string, tchid string, posfileid string, yssk bigint) PARTITIONED BY (yyyymm int) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' LOCATION '/data/' TBLPROPERTIES ('avro.output.codec'='snappy');

+0

パーティションが 'yyyymm'形式の場合、なぜ最初のクエリで' yyyymm = 2016'を使用しましたか? 2番目のクエリでは、 'cast'から' yyyymm = 201601'を使用しようとしています。結果はこれらの条件と同じであってはなりません。また、問題のテーブルスキーマとサンプルデータ(クエリ結果ではない)を追加してください –

+0

申し訳ありません。これはtypo..itは201601です。変更しました。これについて私が助けてくれれば幸いです。 – jeff

+0

は 'yyyymm'です'string'または' int'として定義されていますか?あなたは問題のテーブルスキーマを共有してください。 –

答えて

0

パーティションキーの値は、クエリの実行前に知られている必要があります

は、以下の表のスキーマです。 yyyymm=cast(trim((concat(trim(substr(ActvyDt, 1, 4)), trim(substr(ActvyDt, 6, 2))))) as int) and actvydt>='2016-01-01' and actvydt<='2016-01-09'

Optimizerは、残念ながらクエリの実行前に、かなり複雑な関数からyyyymm値を推測するために、そのような知性を持っていない:あなたはWHERE句を使用しています。さらに明示的な条件を追加してください:yyyymm='201601'これは動作します。それを変数として渡すことができます。

+0

UDFを作成できますか?働くことはありませんか? – jeff

+0

クエリをどのように動作させるか。私はハードコードそれを傾ける。これはactvydtに基づいています。どんな助けでも非常に感知できるだろう。 – jeff

+0

シェル内のyyyymmを計算し、それをhiveconf:yyyymmパラメータとして渡します。または、最小値と最大値をパラメータとして渡し、$ {hiveconf:min_yyyymm}> yyyymmとyyyymm <$ {hiveconf:max_yyyymm}を使用します。 – leftjoin

0

どこかで、何とか値2016-01-01が作成されます。

ちょうどその瞬間、またはそれに非常に近いところで、201601も作成できるはずです。

これを実行すると、2016-01-01と同じ方法でクエリに渡すことができ、問題を解決する必要があります。

関連する問題