2013-07-26 14 views
6

私はMySQLのテーブルを持っています。 nas_comps。ハイブ - 外部(動的)パーティションテーブル

select comp_code, count(leg_id) from nas_comps_01012011_31012011 n group by comp_code; 
comp_code  count(leg_id) 
'J'   20640 
'Y'   39680 

まず、私はHDFSHadoopバージョン1.0.2)を使用してSqoopにデータをインポート:

​​

パーティションカラム:そして

sqoop import --connect jdbc:mysql://172.25.37.135/pros_olap2 \ 
--username hadoopranch \ 
--password hadoopranch \ 
--query "select * from nas_comps where dep_date between '2011-01-01' and '2011-01-10' AND \$CONDITIONS" \ 
-m 1 \ 
--target-dir /pros/olap2/dataimports/nas_comps 

、Iは、外部、分配ハイブテーブルを作成しました記載されるときに示される:

hive> describe extended nas_comps; 
OK 
ds_name string 
dep_date  string 
crr_code  string 
flight_no  string 
orgn string 
dstn string 
physical_cap int 
adjusted_cap int 
closed_cap  int 
leg_id int 
month int 
comp_code  string 

Detailed Table Information  Table(tableName:nas_comps, dbName:pros_olap2_optim, 
owner:hadoopranch, createTime:1374849456, lastAccessTime:0, retention:0, 
sd:StorageDescriptor(cols:[FieldSchema(name:ds_name, type:string, comment:null), 
FieldSchema(name:dep_date, type:string, comment:null), FieldSchema(name:crr_code, 
type:string, comment:null), FieldSchema(name:flight_no, type:string, comment:null), 
FieldSchema(name:orgn, type:string, comment:null), FieldSchema(name:dstn, type:string, 
comment:null), FieldSchema(name:physical_cap, type:int, comment:null), 
FieldSchema(name:adjusted_cap, type:int, comment:null), FieldSchema(name:closed_cap, 
type:int, comment:null), FieldSchema(name:leg_id, type:int, comment:null), 
FieldSchema(name:month, type:int, comment:null), FieldSchema(name:comp_code, type:string, 
comment:null)], location:hdfs://172.25.37.21:54300/pros/olap2/dataimports/nas_comps, 
inputFormat:org.apache.hadoop.mapred.TextInputFormat, 
outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, 
numBuckets:-1, serdeInfo:SerDeInfo(name:null, 
serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters: 
{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys: 
[FieldSchema(name:leg_id, type:int, comment:null), FieldSchema(name:month, type:int, 
comment:null), FieldSchema(name:comp_code, type:string, comment:null)], 
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1374849456}, viewOriginalText:null, 
viewExpandedText:null, tableType:EXTERNAL_TABLE) 

しかし、パーティションがあるために作成されている場合、私はわからない:

hive> show partitions nas_comps; 
OK 
Time taken: 0.599 seconds 


select count(1) from nas_comps; 

0を返し、レコード私はダイナミックパーティションを持つ外部Hiveのテーブルを作成するにはどうすればよい

を?

答えて

9

ハイブはこの方法でパーティションを作成しません。
目的のパーティションキーでパーティション化されたテーブルを作成し、外部テーブルから新しいパーティションテーブル(hive.exec.dynamic.partition=trueおよびhive.exec.dynamic.partition.mode=nonstrictに設定)までinsert overwrite tableを実行するだけです。その後、

あなたは外部から分割されたテーブルを保持しなければならない場合は、手動でディレクトリを作成する必要があります(パーティションごとに1つのディレクトリ名はPARTION_KEY=VALUEでなければなりません) うん、私はこれをチェックしているが、これらは、動的ではありませんMSCK REPAIR TABLE table_name;command

5

動的パーティション

パーティションはハイブテーブルにレコードを挿入する時に動的に追加されます。

  1. サポートはinsert文でのみサポートされます。
  2. load dataステートメントでサポートされていません。
  3. ハイブテーブルにデータを挿入する前に、ダイナミックパーティション設定を有効にする必要があります。 hive.exec.dynamic.partition.mode=nonstrictデフォルト値はstrict hive.exec.dynamic.partition=trueデフォルト値はfalseです。

動的パーティションクエリ

SET hive.exec.dynamic.partition.mode=nonstrict; 
SET hive.exec.dynamic.partition=true; 
INSERT INTO table_name PARTITION (loaded_date) 
select * from table_name1 where loaded_date = 20151217 

ここloaded_date = 20151217パーティションとその値です。

制限事項:

  1. ダイナミックパーティションのみ上記のステートメントで動作します。
  2. table_name1からloaded_date列から選択したデータに従ってパーティションを動的に作成します。

あなたの状態はその後、上記の基準と一致しない場合:

ALTER TABLE table_name ADD PARTITION (DS_NAME='partname1',DATE='partname2'); 

または動的なパーティションの作成のために、このLinkを使用してください:

ファーストは、次のように行い、その後パーティション表を作成します。

+0

を使用パーティション - まだパーティションの値を提供する必要があります。 –

+1

右、シェルスクリプトで実行します。パーティションのシェルスクリプトに変数を作成し、alter tableコマンドで渡すこともできます。 –

関連する問題