Hadoop上の既存のファイルからパーティションを含むテーブルを作成したいと思います。パーティション化する必要のあるdatevalueはファイルで利用できますが、datevalue列の位置が最後ではありません。真ん中です。同じもののテーブルを作成するにはどうすればよいですか?
サンプルは次のとおりです。
1 John 2012-01-10 Miller
2 Austin 2012-02-22 Powers
例を見てみましょう。3つの列を持つパーティション化されたハイブテーブルが必要です。(id INT, fname STRING, dt STRING, lname STRING)
ここid
でfname
、、lname
は整数ID、文字列の名、文字列の姓をそれぞれ格納する列であり、dtはyyyyの日付を含む文字列タイプのパーティション列です。 -MM-dd形式。このようなテーブルを作成するには、次のようなコマンドを発行します。
CREATE EXTERNAL TABLE my_table (id INT, fname STRING, lname STRING)
PARTITIONED BY (dt STRING)
LOCATION '/usr/hive/warehouse/my_table';
このテーブルにデータを挿入し(たとえば、INSERT OVERWRITEコマンドを使用)、HDFSの場所(/ usr / hive / Warehouse / my_table)を確認すると、データがディレクトリに保存されていることがわかります。パーティションごとに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