外部表不会返回其文件夹中的数据

时间:2014-09-10 07:24:48

标签: hive external cloudera

我在Hive中创建了一个外部表,位于此位置:

CREATE EXTERNAL TABLE tb 
(
...
) 
PARTITIONED BY (datehour INT)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
LOCATION '/user/cloudera/data';

数据存在于文件夹中,但是当我查询表时,它什么都不返回。该表的结构使其适合数据结构。

SELECT * FROM tb LIMIT 3;

Hive表是否存在一种权限问题:特定用户是否有权查询某些表? 你知道一些解决方案或解决方法吗?

2 个答案:

答案 0 :(得分:6)

您已根据 datehour 列创建了分区表表,但是您将数据放在 / user / cloudera / data 中。 Hive将在 / user / cloudera / data / datehour =(某个int值)中查找数据。由于它是外部表,因此不会更新Metastore。您需要运行一些alter语句来更新

以下是带分区的外部表的步骤:

1。)在您的外部位置 / user / cloudera / data 中,创建一个目录 datehour = 0909201401

                                OR

使用以下方式加载数据:LOAD DATA [LOCAL] INPATH'/ path / to / data / file'INTO TABLE partition(datehour = 0909201401)

2.。)创建表后运行alter语句:     ALTER TABLE ADD PARTITION(datehour = 0909201401)

希望它有所帮助...... !!!

答案 1 :(得分:1)

当我们创建带有PARTITION的EXTERNAL TABLE时,我们必须使用给定分区的数据位置来更改EXTERNAL TABLE。但是,它不必与创建EXTERNAL TABLE时指定的路径相同。

hive> ALTER TABLE tb ADD PARTITION (datehour=0909201401)
hive> LOCATION '/user/cloudera/data/somedatafor_datehour'
hive> ;

当我们在创建EXTERNAL TABLE时指定LOCATION'/ user / cloudera / data'(尽管它是可选的)时,我们可以利用对该表进行修复操作的一些优势。因此,当我们想通过诸如ETL之类的过程将文件复制到该目录中时,我们可以使该分区与EXTERNAL TABLE同步,而不必编写ALTER TABLE语句来创建另一个新分区。

如果我们已经知道HIVE将创建的分区的目录结构,我们可以简单地将数据文件放置在该位置,例如“ /user/cloudera/data/datehour=0909201401/data.txt”,然后将语句运行为如下所示:

hive> MSCK REPAIR TABLE tb;  

上面的语句会将分区同步到表“ tb”的配置单元存储。