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

Hive 外部表不返回其文件夹中的数据,hive,external,cloudera,Hive,External,Cloudera,我已在配置单元中的以下位置创建了一个外部表: 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; 配置单元表是否存在某

我已在配置单元中的以下位置创建了一个外部表:

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;
配置单元表是否存在某种权限问题:特定用户是否具有查询某些表的权限?
您知道一些解决方案或解决方法吗?

您已经基于列datehour创建了分区表,但您正在将数据放入/user/cloudera/data中。配置单元将在/user/cloudera/data/datehour=(一些int值)中查找数据。因为它是一个外部表,所以配置单元不会更新元存储。您需要运行一些alter语句来更新它

下面是使用分区的外部表的步骤:

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

                                OR
使用以下命令加载数据:将路径“/path/to/data/file”中的数据[LOCAL]加载到表分区中(datehour=0909201401)

2.)创建表后,运行alter语句: ALTER TABLE ADD PARTITION(日期小时=0909201401)


希望对你有帮助

当我们使用分区创建外部表时,我们必须使用给定分区的数据位置更改外部表。但是,它不必与创建外部表时指定的路径相同

hive> ALTER TABLE tb ADD PARTITION (datehour=0909201401)
hive> LOCATION '/user/cloudera/data/somedatafor_datehour'
hive> ;
当我们在创建外部表时指定位置“/user/cloudera/data”(虽然是可选的)时,我们可以利用在该表上执行修复操作的一些优势。因此,当我们想通过一些过程(如ETL)将文件复制到该目录中时,我们可以将分区与外部表同步,而不是编写ALTERTABLE语句来创建另一个新分区

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

hive> MSCK REPAIR TABLE tb;  

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

我知道这个问题提出已经有一段时间了,但我现在又回到这个问题上来了。在您的回答中有几点我没有理解:1_最初创建的分区表不再可用?2\我是否必须创建一个分区为datehour=0909201401的新表?3\ u如果我没有要加载到新表中的数据怎么办?提前感谢您,祝您度过愉快的一天。1.)只有按照我提到的方法创建目录结构并运行ALTERTABLE语句,它才可用。2.)不,您不必创建一个单独的表,同一个表将完成此工作。3.)如果没有要加载的数据,则不要创建分区。这会澄清你的疑问吗?我已经完成了上述步骤。它是有效的。我说的目标是摆脱分区,对吗?谢谢。好吧,说去掉分区是不对的。因为在你提到的问题中,你需要分区。如果需要,我仍然建议尝试使用分区。因为分区对于海量数据有它自己的优势。