Amazon S3に保存されたデータを処理するために、Hive(外部テーブル)を使用しています。
私のデータは次のように分割されます:
DIR s3://test.com/2014-03-01/
DIR s3://test.com/2014-03-02/
DIR s3://test.com/2014-03-03/
DIR s3://test.com/2014-03-04/
DIR s3://test.com/2014-03-05/
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log
ハイブを使用してパーティションテーブルを作成する方法
CREATE EXTERNAL TABLE test (
foo string,
time string,
bar string
) PARTITIONED BY (? string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';
誰かがこの質問に答えることができますか?ありがとう!
最初に正しいテーブル定義から始めます。あなたの場合、あなたが書いたものを使用します:
CREATE EXTERNAL TABLE test (
foo string,
time string,
bar string
) PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION 's3://test.com/';
Hiveはデフォルトで、パーティションがs3://test.com/partitionkey=partitionvalueという規則で指定されたサブディレクトリにあると想定しています。例えば
s3://test.com/dt=2014-03-05
この規則に従えば、MSCKを使用してすべてのパーティションを追加できます。
この命名規則を使用できない場合、または使用したくない場合は、次のようにすべてのパーティションを追加する必要があります。
ALTER TABLE test
ADD PARTITION (dt='2014-03-05')
location 's3://test.com/2014-03-05'
日付フィールドを使用してパーティションを作成する場合は、次のようにs3フォルダー構造が必要です。
s3://test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
そのような場合、パーティション列をdateとして外部テーブルを作成し、MSCK REPAIR TABLE EXTERNAL_TABLE_NAME
Hiveメタストアを更新します。
上記のカーターシャンクリンによる回答をご覧ください。ファイルがpartitionkey = partitionvalueとしてディレクトリ構造に格納されていることを確認する必要があります。つまり、デフォルトでは、Hiveはパーティションが規則で指定されたサブディレクトリにあることを想定しています。
あなたの例では、として保存する必要があります
s3://test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log.
従うべき手順:
i)上記の構造にデータが存在することを確認しますii)外部テーブルを作成しますiii)msck repairテーブルを実行します。
データはs3ロケーションに存在し、メタデータ(emrfs)で更新されない可能性があると思います。これを最初に機能させるには、emrfs importとemrfs syncを実行します。そして、msck修復を適用します。
S3に存在するすべてのパーティションを追加します
<partition name>=<partition value>
に準拠していない既存のディレクトリ構造がある場合、パーティションを手動で追加する必要があります。 MSCK REPAIR TABLEは、ディレクトリをそのように構成しない限り機能しません。
テーブルの作成時に次のような場所を指定した後:
CREATE EXTERNAL TABLEテスト( foo string、 time string、 bar string ) PARTITIONED BY(dt string) 行フォーマットが制限されています '\ t' LOCATION 's3://test.com/'; で終了したフィールド
フルパスを指定せずにパーティションを追加できます:
ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05';
一度もチェックしたことはありませんが、バケット自体ではなく、バケット内のフォルダーにパーティションを移動することをお勧めします。例えば。 s3://test.com/
からs3://test.com/data/
へ。