2012-01-27 15 views
12

入力テキストファイルをhdfsの複数のサブディレクトリに移動するHiveテーブルを作成したいとします。たとえばだから私は、HDFSに持っている:ハイブ:複数のファイルを複数のディレクトリに作成する

/testdata/user/Jan/part-0001 
    /testdata/user/Feb/part-0001 
    /testdata/user/Mar/part-0001 
and so on... 

私はハイブで、テーブルのユーザーを作成したいが、ユーザーのサブディレクトリをトラバースすることができている場合は、それが行うことができますか?私はこのようなことを試みたが、うまくいかなかった。

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*' 

私はワイルドカードを追加すると効果があると思っていましたが、そうではありません。私はワイルドカードを使用しないようにしてもまだ動作しません。しかし、私はファイルをユーザーのルートディレクトリにコピーすると、それは動作します。 Hiveが子ディレクトリに移動してそれらのファイルを取得する方法はありませんか?

答えて

5

ハイブは、データのパーティションとサブディレクトリを使用していますので、単に:あなたのためにそれを行う必要があります

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) 
STORED AS TEXTFILE LOCATION '/testdata/user/' 

+0

これは機能しませんでした。実際に、私は今CDH3u1を実行していると述べているはずです。 – user706794

+2

「うまくいかない」と定義します。私はまた、月= Janなどにあなたのディレクトリ名を変更する必要があることに言及する必要があります。 –

0
CREATE EXTERNAL TABLE user (id int, name string); 
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users; 
+0

これは動作しませんでした。実際、私は今CDH3u1について言及する必要があります。 – user706794

+0

CDH5.7の私のために働いていない – voldy

17

外部テーブルを作成し、サブフォルダをパーティションとして追加することができます。

CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY (yymmdd STRING); 
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1'; 
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2'; 
+0

これは素晴らしい応答です!そうですね、新しいデータディレクトリがあるたびにテーブルを更新する必要があります(私の場合は1日に1回)。しかし、ただ完璧に動作します。 –

+0

これは、Hiveがデータをどのように格納するかについての素晴らしい点の1つです。このようにして格納されたデータをパーティションとして表現すると、パーティションデータは仮想列になります。つまり、結果を一部の日付(この場合)に限定する方法でクエリを実行すると、Hiveはデータセット全体をスキャンするのではなく、いくつかの場所で検索するだけです。 – agentv

+0

これは受け入れられた回答として選択する必要があります。質問に完全に答えます。あなたも私を助けてくれました。お返事いただきありがとうございます! –

5

サブディレクトリが先験的に知られていないユースケースについては、以下のようなシェルスクリプトを使用してしまいました。

#!/bin/bash 
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; " 

hscript="" 

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`; 
do 

echo $part 
tmp="ALTER TABLE users ADD PARTITION(month='$part');" 
hscript=$hscript$tmp 
done; 

hive -e "$hscript"