入力テキストファイルがhdfsの複数のサブディレクトリにトラバースされるHiveテーブルを作成したいと思います。だから私がhdfsに持っている例:
/testdata/user/Jan/part-0001
/testdata/user/Feb/part-0001
/testdata/user/Mar/part-0001
and so on...
Hiveでテーブルユーザーを作成したいが、ユーザーのサブディレクトリをトラバースできる場合、それは可能ですか?私はこのようなことを試しましたが、うまくいきません。
CREATE EXTERNAL TABLE users (id int, name string)
STORED AS TEXTFILE LOCATION '/testdata/user/*'
ワイルドカードを追加することは機能すると思いましたが、機能しません。ワイルドカードを使用しないようにした場合でも、機能しません。ただし、ファイルをユーザーのルートディレクトリにコピーすると、機能します。 Hiveが子ディレクトリに移動し、それらのファイルを取得する方法はありませんか?
外部テーブルを作成してから、サブフォルダーをパーティションとして追加できます。
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';
サブディレクトリが事前にわからないユースケースでは、以下のようなシェルスクリプトを使用することになりました。
#!/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"
Hiveはサブディレクトリをデータのパーティションとして使用するため、次のようになります。
CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string)
STORED AS TEXTFILE LOCATION '/testdata/user/'
それはあなたのためにそれをするはずです。
CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;
パスHiveはすべてのサブディレクトリを自動的に取得するため、/ testdata/user /の後に*を付けないでください。
パーティションを作成する場合は、/ testdata/user/year = dynamicyear/month = dynamicmonth/date = dynamicdateのようなHDFSフォルダーを作成します。
パーティションを使用してテーブルを作成した後、msck修復テーブルtablenameを使用します。
CREATE EXTERNAL TABLE users (id int, name string)
STORED AS TEXTFILE LOCATION '/testdata/user/'