1. 为什么内部表的删除,就会将数据全部删除,而外部表只删除表结构? 为什么用外部表更好 ?
内部表和外部表的删除行为之所以不同,是因为它们的设计目的和使用场景有所区别:
内部表删除行为:
- 生命周期管理:内部表的生命周期与Hive紧密绑定。当内部表被删除时,Hive会认为表及其数据不再需要,因此会同时删除表的元数据和数据文件,以释放存储空间和维护数据的一致性。
- 数据安全:内部表提供了一种安全的数据管理方式,确保在删除表时不会遗留不需要的数据。
外部表删除行为:
- 元数据与数据分离:外部表的元数据存储在Hive中,而数据文件存储在HDFS上指定的位置。这种设计允许数据文件独立于Hive的生命周期存在。
- 数据共享:外部表使得数据可以被多个系统或工具共享。即使Hive表被删除,数据文件仍然可以在其他系统中使用。
- 数据保护:删除外部表时,Hive不会删除数据文件,从而保护数据不被意外删除,这对于重要的数据备份和跨系统的数据分析非常有用。
为什么使用外部表更好:
- 数据重用:外部表允许数据在不同的分析和处理系统之间重用,无需复制数据。
- 数据保护:外部表提供了额外的数据保护层,因为即使表被删除,原始数据仍然安全地存储在HDFS上。
- 跨系统共享:外部表支持跨Hive实例的数据共享,这对于大型组织中不同团队之间的协作非常有用。
- 数据管理:外部表允许数据由其他系统或应用程序管理,这有助于维护数据的一致性和完整性。
- 灵活性:外部表提供了更大的灵活性,使得数据可以在不同的查询和分析工具之间轻松迁移。
总结:
选择内部表还是外部表取决于具体的使用场景和需求。如果数据是临时的,或者完全由Hive管理,内部表可能是更好的选择。如果数据需要跨系统共享,或者需要额外的数据保护,外部表可能更合适。在实际应用中,根据数据的重要性、使用频率和共享需求来做出选择。
2. 简述Hive建表语句?创建表时使用什么分隔符 ?
在 Hive 中,创建表的基本语法如下:
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name (
column1_name column1_datatype [COMMENT 'column1_comment'],
column2_name column2_datatype [COMMENT 'column2_comment'],
...
)
[COMMENT 'table_comment']
ROW FORMAT DELIMITED
FIELDS TERMINATED BY char
[LINES TERMINATED BY char]
[STORED AS {TEXTFILE | SEQUENCEFILE | RCFILE | ORC | PARQUET | AVRO | JSON}]
[LOCATION 'table_path']
[TBLPROPERTIES (property_name=property_value, ...)];
下面是对创建表语句中各个部分的简要说明:
IF NOT EXISTS
:可选,如果表已存在,则不创建新表。db_name
:可选,指定数据库名称。table_name<