Hive - 分区上的查询不返回任何内容

时间:2012-11-02 19:01:57

标签: hadoop hive

我有一个正在按特定开始日期(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似乎可以正常读取分区,但不会返回任何结果。

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对表本身内的日期字段运行查询,并且不使用该分区,我会得到正确的结果。

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和hive 0.9。我对hive / hadoop很新,所以任何帮助都会受到赞赏。

感谢。

编辑1:     蜂房&GT;描述格式化的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上执行fs -ls:// hadoop5.internal/user/hive/warehouse/vtc4/ds=2012-11-01它运行正常。

2 个答案:

答案 0 :(得分:2)

看起来像是一个权限的东西,或者与hive或者namenode的元数据一样时髦的东西。这是我会尝试的:

  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上的该分区

答案 1 :(得分:0)

配置单元分区的另一件事是,在配置单元外部创建时(例如从sparksql)有时它不在元数据系统中注册。您也可以在对分区进行任何更改后尝试MSCK REPAIR TABLE xc_bonus;,以使其正确反映。