HIVE中外部表上的计数

数据挖掘 蜂巢
2022-02-26 08:32:00

我一直在尝试围绕HIVE中的EXTERNAL表概念

CREATE EXTERNAL TABLE IF NOT EXISTS MovieData
(id INT, title STRING,releasedate date, videodate date,
URL STRING,unknown TINYINT, Action TINYINT, Adventure TINYINT, 
Animation TINYINT,Children TINYINT, Comedy TINYINT, Crime TINYINT, 
Documentary TINYINT, Drama TINYINT, Fantasy TINYINT,
Film-Noir TINYINT, Horror TINYINT, Musical TINYINT, 
Mystery TINYINT, Romance TINYINT, Sci-Fi TINYINT,
Thriller TINYINT, War TINYINT, Western TINYINT)
COMMENT 'This is a list of movies and its genre'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE; 

使用上述语句创建了一个表,然后使用LOAD语句来填充数据。

LOAD DATA LOCAL INPATH '/home/ubuntu/MovieLens.txt' INTO TABLE MovieData;

下次我在 HIVE 中删除表并重新创建它并加载数据...但是当我对表执行COUNT操作时,我得到的值是我加载的文件中存在的值的两倍。

我通读了几篇文章,EXTERNAL表不会删除数据,而是仅从 HIVE 元存储中删除模式...外部表

你能告诉我为什么HIVE会这样吗?

2个回答

在 Hadoop 框架中,有多种方法可以分析数据。这取决于您的用例、专业知识和偏好。HiveEXTERNAL表的设计方式使得其他程序员也可以从其他数据处理模型(如 Pig、MapReduce 编程、Spark 等)共享相同的数据位置,而不会影响彼此的工作。

在外部表的情况下,如果您不小心删除了表,您将不会丢失数据,因为您已经知道它只会删除元数据并删除架构并且数据保持不变。

HDFS如果用户想要在其中放置一些元数据以便可以使用 Hive 查询和操作数据,则此方法很有用。或者您正在HDFS从其他 ETL 工具加载数据。

由于 EXTERNAL 表不会删除数据并且您正在再次加载文件,因此您将获得计数差异。如果您自己完成所有操作,如加载、分析、删除等,HiveINTERNAL也支持该表。如果要在删除表时删除数据,可以使用 HiveINTERNAL表。要创建内部表,您只需EXTERNAL从查询中删除关键字,当您删除此表时,它也会删除数据。

在配置单元中,如果您正在使用drop删除表并且该表是外部表,那么它只会删除该表。

当您创建表时,它会在 hadoop 中使用您指定的路径创建一个目录。但是,如果您不提供任何路径,它将采用默认目录(如/user/hive/warehouse/table_name:)并使用表名创建一个目录。当您将数据从文本文件加载到外部表中时,它会将数据加载到表中,并且还将数据加载到 hadoop 路径中。如果您删除表,那么它只会删除该表,因为它是一个外部表,它不会从 hadoop 中删除数据。

下次删除后,当您重新创建表并重新加载数据时,它将新数据和旧数据存储在 hadoop 路径中。这就是为什么你得到双重计数。

如果你想避免这种情况,你必须手动从 hadoop 中删除文件hadoop fs -rmr /path to directory/或者在删除 tabletruncate命令之前。

其它你可能感兴趣的问题