5

HDFS の場所 (/user/hive/warehouse/tableX) のすべてのファイルからデータを読み取る外部テーブルがあり、Hive に外部テーブルを作成しました。

ここで、データの事前パーティション化があり、以前のすべてのファイルが特定の名前規則 < dir_name >_< incNumber > などでいくつかのディレクトリに吐き出されていると仮定しましょう。

/user/hive/warehouse/split/
  ./dir_1/files...
  ./dir_2/files...
  ./dir_n/files...

分割フォルダー内のすべてのファイルを追跡する別の外部テーブルを作成するにはどうすればよいですか?

各サブフォルダー (dir_x) でパーティション分割された外部テーブルを作成する必要がありますか?

また、そのために、サブディレクトリごとにパーティションを作成/追加できるある種のハイブまたはシェルスクリプトが必要ですか?

4

2 に答える 2

5

複数のフォルダー内のすべてのファイルにアクセスするには、dir_x でパーティション分割された外部テーブルを作成する必要があります。

CREATE external TABLE sample_table( col1 string,
                                    col2 string,
                                    col3 string,
                                    col4 string)
PARTITIONED BY (dir string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/split';

次に、通常のパーティション分割されたテーブルと同じようにパーティションを追加します

ALTER TABLE sample_table ADD PARTITION(dir='dir_1')
LOCATION '/user/hive/warehouse/split/dir_1';
ALTER TABLE sample_table ADD PARTITION(dir='dir_2')
LOCATION '/user/hive/warehouse/split/dir_2';

このアプローチは機能します。このアプローチには問題があります。将来、新しいフォルダー (dir_100 など) をハイブ ウェアハウス パスに追加する場合は、sample_table を削除して再作成し、ALTER TABLE ステートメントを使用してすべてのパーティションをsample_tableに再度追加する必要があります。私はハイブを約 10 か月間使用していないため、より良いアプローチがあるかどうかはわかりません。これが問題にならない場合は、このアプローチを使用できます。

于 2016-06-01T23:08:05.660 に答える
2

外部テーブルを配置したら、ハイブが作成するパーティション構造がわかります。何らかのプロセスを経て、データ ファイルを (事前にパーティション分割されたフォルダーに) ドライブに読み込むことができます。事前にパーティション分割されたファイルが利用可能になったら (ハイブの既知のパーティション構造に従って)、以下のようにテーブルを修復できます。

hive> MSCK REPAIR TABLE sample_table; 

上記のステートメントは、既存のすべてのパーティションを、既存の EXTERNAL TABLE "sample_table" のハイブ メタ ストアに自動的に同期します。

于 2019-01-31T06:47:48.043 に答える