2

特定の開始日 (ds) で分割されているテーブルがあります。最新のパーティション (前日のデータ) を照会することができ、そのパーティションは問題なく使用されます。

hive> select count(1) from vtc4 where ds='2012-11-01' ;
...garbage...
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 6.43 sec   HDFS Read: 46281957 HDFS Write:  7 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 430 msec
OK
151225
Time taken: 35.007 seconds

ただし、以前のパーティションをクエリしようとすると、ハイブはパーティションを正常に読み取っているように見えますが、結果は返されません。

hive> select count(1) from vtc4 where ds='2012-10-31' ;
...garbage...
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 7.64 sec   HDFS Read: 37754168 HDFS Write: 2 SUCCESS
Total MapReduce CPU Time Spent: 7 seconds 640 msec
OK
0
Time taken: 29.07 seconds

ただし、テーブル自体の日付フィールドに対してクエリを実行し、パーティションを使用しないようにハイブに指示すると、正しい結果が得られます。

hive> select count(1) from vtc4 where date_started >= "2012-10-31 00:00:00" and date_started < "2012-11-01 00:00:00" ;
...garbage...
MapReduce Jobs Launched:
Job 0: Map: 63  Reduce: 1   Cumulative CPU: 453.52 sec   HDFS Read: 16420276606 HDFS Write: 7 SUCCESS
Total MapReduce CPU Time Spent: 7 minutes 33 seconds 520 msec
OK
123201
Time taken: 265.874 seconds

ここで何が欠けていますか?Hadoop 1.03 とハイブ 0.9 を実行しています。私はハイブ/ハドープにかなり慣れていないので、助けていただければ幸いです。

ありがとう。

編集 1: hive> フォーマットされた vtc4 パーティションを記述 (ds='2012-10-31');

Partition Value:        [2012-10-31 ]
Database:               default
Table:                  vtc4
CreateTime:             Wed Oct 31 12:02:24 PDT 2012
LastAccessTime:         UNKNOWN
Protect Mode:           None
Location:               hdfs://hadoop5.internal/user/hive/warehouse/vtc4/ds=2012-10-31
Partition Parameters:
    transient_lastDdlTime   1351875579

# Storage Information 
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat:            org.apache.hadoop.mapred.TextInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed:             No
Num Buckets:            -1
Bucket Columns:         []
Sort Columns:           []
Storage Desc Params:
serialization.format    1
Time taken: 0.191 seconds

パーティション フォルダーは存在しますが、hdfs://hadoop5.internal/user/hive/warehouse/vtc4/ds=2012-10-31 で hadoop fs -ls を実行しようとすると、ファイル/ディレクトリが存在しないと表示されます。Web インターフェイスを使用してそのディレクトリを参照すると、フォルダにアクセスでき、/part-m-000* ファイルも表示されます。hdfs://hadoop5.internal/user/hive/warehouse/vtc4/ds=2012-11-01 で fs -ls を実行すると、正常に動作します。

4

2 に答える 2

2

アクセス許可の問題か、ハイブまたはネームノードのメタデータのファンキーなもののようです。これが私が試すことです:

  1. そのパーティションのデータを hdfs の別の場所にコピーします。アクセス許可の設定方法によっては、hive または hdfs ユーザーとしてこれを行う必要がある場合があります。
  2. alter table vtc4 drop partition (ds='2012-10-31');
  3. alter table vtc4 add partition (ds='2012-10-31');
  4. hdfsのそのパーティションにデータをコピーして戻します
于 2012-11-02T21:43:59.323 に答える