web-dev-qa-db-ja.com

ハイブ:複数のディレクトリを持つ複数のファイルを使用したテーブルの作成

入力テキストファイルが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が子ディレクトリに移動し、それらのファイルを取得する方法はありませんか?

16
user706794

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

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

サブディレクトリが事前にわからないユースケースでは、以下のようなシェルスクリプトを使用することになりました。

#!/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"
7
Dhanesh

Hiveはサブディレクトリをデータのパーティションとして使用するため、次のようになります。

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

それはあなたのためにそれをするはずです。

5
Steve Severance
CREATE EXTERNAL TABLE user (id int, name string);
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users;
0
Kai Zhang

パス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/'
0