私は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');
パーティションが 'yyyymm'形式の場合、なぜ最初のクエリで' yyyymm = 2016'を使用しましたか? 2番目のクエリでは、 'cast'から' yyyymm = 201601'を使用しようとしています。結果はこれらの条件と同じであってはなりません。また、問題のテーブルスキーマとサンプルデータ(クエリ結果ではない)を追加してください –
申し訳ありません。これはtypo..itは201601です。変更しました。これについて私が助けてくれれば幸いです。 – jeff
は 'yyyymm'です'string'または' int'として定義されていますか?あなたは問題のテーブルスキーマを共有してください。 –