解決済み:この問題の「解決策」については、以下の更新#2を参照してください。
~~~~~~~
s3では、次のようなネストされたディレクトリ構造にいくつかのlog*.gzファイルが保存されています。
s3://($BUCKET)/y=2012/m=11/d=09/H=10/
次のようなマルチレベルのパーティション仕様を使用して、これらをHive on Elastic Map Reduce(EMR)にロードしようとしています。
create external table logs (content string)
partitioned by (y string, m string, d string, h string)
location 's3://($BUCKET)';
テーブルの作成は機能します。次に、既存のすべてのパーティションを回復しようとします。
alter table logs recover partitions;
これは機能しているようで、s3構造をドリルダウンして、さまざまなレベルのディレクトリをすべて追加します。
hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08
y=2012/m=11/d=06/h=09
y=2012/m=11/d=06/h=10
y=2012/m=11/d=06/h=11
y=2012/m=11/d=06/h=12
y=2012/m=11/d=06/h=13
y=2012/m=11/d=06/h=14
y=2012/m=11/d=06/h=15
y=2012/m=11/d=06/h=16
...
したがって、Hiveは私のファイルレイアウトを正常に認識して解釈できるようです。ただし、実際のデータが読み込まれることはありません。単純なカウントを実行しようとしたり、*を選択したりしても、何も得られません。
hive> select count(*) from logs;
...
OK
0
hive> select * from logs limit 10;
OK
hive> select * from logs where y = '2012' and m = '11' and d = '06' and h='16' limit 10;
OK
考え?パーティションを回復する以外にデータをロードするための追加のコマンドがありませんか?
明示的な場所でパーティションを手動で追加すると、次のように機能します。
alter table logs2 add partition (y='2012', m='11', d='09', h='10') location 's3://($BUCKET)/y=2012/m=11/d=09/H=10/'
これを行うためのスクリプトを書くことはできますが、「パーティションを回復する」という基本的なものが欠けているように感じます。
更新#1
以下のコメントでのJoeKによる見事で鋭い観察のおかげで、大文字と小文字の区別の問題がここに関係している可能性があると思います。
ファイルは間違いなく次のパス仕様のように編成されており、大文字のHが付いています(これはiso8601形式にうなずくかもしれません)。
s3://($BUCKET)/y=2012/m=11/d=09/H=10/
適切な大文字化を行うパーティション仕様を使用して外部テーブルを作成します。
partitioned by (y string, m string, d string, H string)
(「H」に注意してください)。私はパーティションの回復を行います。これはディレクトリを繰り返してパーティションを適切に見つけるように見えますが、どういうわけか(これまでのすべての有益な場所で「H」を使用しているにもかかわらず)、Hiveはそれを小文字の「h」として保存しているようです:
hive> show partitions logs;
OK
y=2012/m=11/d=06/h=08
(「h」に注意してください)。したがって、Hiveはパーティションを検出できるようですが、小文字の形式で格納します...後でデータを検索するときに、S3では大文字と小文字が区別されるため、これらのパスは(もちろん)空です。
データをすべて小文字のディレクトリ構造に移動し、それが機能するかどうかを確認します...
更新#2
実際、ここでは、パーティション名として大文字の「H」(s3ファイルレイアウト内)が問題であることが確認されました。私が知る限り、これが起こっていたことです:
- S3のレイアウトでは、大文字と小文字が区別されるパーティション名(H =)が使用されていました。
- RECOVER PARTITIONSを実行すると、これらのパーティションが正しく検出されます。
- しかし、それらは小文字(h)として内部的に保存されます
「recoverpartitions」コマンドは、Amazonによって作成されたHiveの拡張機能です。このコンポーネントにバグがあるのではないかと強く思います。私の知る限り、ネイティブHiveには、パーティション検出のためにファイルルートを探索するという概念はありません...