2012-04-23 9 views
2

Hadoop上の既存ファイルからパーティションを持つテーブルを作成したいとします。私が分割する必要のある日付の値はファイルにありますが、日付の値の列の位置は最後ではありません。真ん中にあります。どうすれば同じテーブルを作成できますか?ここでHiveテーブルのパーティションが中間にあるカラム

はサンプルです:

1 John 2012-01-10 Miller 
2 Austin 2012-02-22 Powers 

答えて

7

のは例を見てみましょう:あなたは、3つの列idfnamelnameは整数のIDを格納する列です(id INT, fname STRING, dt STRING, lname STRING)持つパーティションハイブテーブルを持ちたい、文字列の最初の名前dstはyyyy-MM-dd形式の日付を含むstring型のパーティション列です。

CREATE EXTERNAL TABLE my_table (id INT, fname STRING, lname STRING) 
PARTITIONED BY (dt STRING) 
LOCATION '/usr/hive/warehouse/my_table'; 

あなたは、このテーブルにデータを挿入(INSERT上書きコマンドでは、と言う)及び(は/ usr /ハイブ/倉庫/ my_tableにHDFSの場所を確認しに行く:あなたのようなコマンドを発行し、このようにテーブルを作成するには)、データがディレクトリに格納されていることがわかります。パーティションごとに1つのディレクトリ。ディレクトリの名前は、dt = 2012-01-01またはdt = 2012-02-22のようになります。これらのディレクトリの中には、格納するために選択した形式の実際のデータがあります。パーティションの列はではなく、です。 仮想の列は、データが存在するパーティションディレクトリから解読されます。

ここで質問に行きましょう。パーティション化列は仮想列なので、パーティション化されたHiveテーブルをそのままデータの上に置くことはできません(パーティショニング対象の列がファイルの途中にあるか最後に存在するかにかかわらず)。パーティショニングが機能するには、HDFSに適切なディレクトリ構造が存在する必要があります。パーティション化されていないステージング表を作成するとします。

CREATE EXTERNAL TABLE my_table_staging (id INT, fname STRING, dt STRING, lname STRING) 
LOCATION '/usr/hive/warehouse/my_table_staging'; 

次に、このステージングテーブルをソースとして使用して、動的パーティショニングを使用してパーティションテーブルを作成します。あなたはこのために、以下のいずれかのようコマンドを使用することができます。

INSERT OVERWRITE TABLE my_table PARTITION (dt) 
SELECT id, fname, lname, dt FROM my_table_staging; 

このコマンドは、ステージングテーブルからデータを読み込み、パーティション表に挿入し、HDFS上のあなたのための適切なディレクトリ構造を作成します。

参考文献: - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL - https://cwiki.apache.org/Hive/dynamicpartitions.html

関連する問題