【问题标题】:Hive create table from file with partitionHive 从带有分区的文件创建表
【发布时间】:2015-12-29 04:59:18
【问题描述】:

我遇到了一个我无法完全理解的奇怪的 HIVE 行为。 我真的希望有人能对这件事有所了解。

我正在使用以下脚本来创建数据并将其添加到表中:

DROP TABLE myTbl;
CREATE EXTERNAL TABLE myTbl (
    Col1 string,
    Col2 string,  
    Col3 string,
    Col4  string,
)
PARTITIONED BY (partition STRING)
LOCATION '${hiveconf:Valid_location_on_aws_s3_with_the_proper_file_to_create_table}';

Hive 运行脚本返回 OK 但(这是问题)表为空。 跑步: select * from myTbl; 不返回任何内容

在脚本运行以下命令/脚本后,这个问题的解决方案相当简单:

MSCK REPAIR TABLE myTbl

现在在该表上执行选择时,我可以看到文件中的所有数据。

我无法理解的是为什么我需要使用修复才能看到表中的数据。

附:使用 LOAD INTO TABLE 可以完美运行,无需任何修复。

【问题讨论】:

  • 请不要使用全大写标题。

标签: hadoop hive bigdata hiveql


【解决方案1】:

这可能与 DROP TABLE 删除所有表分区的元数据的情况有关。但是 CREATE TABLE 不会在 Metastore 中重新创建此信息。因此,在发出 CREATE TABLE Hive 之后,还不知道有分区并且其中有数据。 MSCK REPAIR TABLE 在 Metastore 中重新创建此信息(或者您可以使用 ALTER TABLE tbl ADD PARTITION 手动完成)。

【讨论】:

  • 感谢您的宝贵时间!据我所知,drop external table 不会删除元数据(如果我错了,请纠正我)。撇开这一点不谈,您是说即使我在使用分区的同时创建表,但它不会写入元数据?
  • DROP TABLE 用于外部表会删除元数据。它不会丢弃数据。关于你的第二个问题,是的,就是这样。我不知道 Hive 如何处理存储在 AWS S3 上的数据,但是对于 HDFS 上的常规数据,每个分区都是一个目录。如果您手动创建该目录并向其中添加数据,例如使用 hdfs -put,Hive 永远不会知道您已经创建了它并且其中有数据,直到您使用 ADD PARTITION 显式创建分区或运行 MSCK REPAIR。
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2021-11-13
  • 2016-09-06
  • 2018-11-11
  • 1970-01-01
相关资源
最近更新 更多