2016-06-01 26 views
4

HDFSの場所(/ user/hive/warehouse/tableX)からすべてのファイルを読み込み、Hiveに外部テーブルを作成した外部テーブルがあります。Hadoop - HDFSの複数のディレクトリから外部テーブルを作成

さて、データのいくつかの事前パーティションがあると仮定して、以前のすべてのファイルが特定の名前の規則にいくつかのディレクトリにスピッティングさせ< DIR_NAME> _ < incNumber>例えば

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

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

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

また、サブディレクトリごとにパーティションを作成/追加できるようなHiveやシェルスクリプトが必要ですか?

答えて

3

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

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'; 

にこのアプローチがうまくいくだろうと

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'; 

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

+1

返信いただきありがとうございます。確かにこれが解決策ですが、問題は、新しいディレクトリが定期的に(たとえば毎日)追加されることです。したがって、テーブルを再作成するには、./splitのすべてのディレクトリを読み込むスクリプトのようなものが必要です。これが非常に効率的か、最善の解決策であるかはわかりません。 –

+1

@Alginaこれを行うためのOozieスクリプトを書くことができます。 oozieスクリプトはテーブルを削除して再作成し、新しいエントリがあるときはいつでもすべてのパーティションを元に戻すことができます。 – dheee

関連する問題