当前位置: 首页 > 面试题库 >

如何使用HiveQL语句在Hive中创建临时表?

傅乐湛
2023-05-16

Hive临时表介绍

作为临时表创建的表将只对当前会话可见。数据将存储在用户的scratch目录中,并在会话结束时删除。

如果用数据库中已经存在的永久表的数据库/表名创建了一个临时表,那么在该会话中,对该表的任何引用都将解析为临时表,而不是永久表。如果不删除临时表或将其重命名为不冲突的名称,用户将无法在该会话中访问原始表。

临时表存在如下限制:

不支持分区列

不支持创建索引

Hive的临时表在数据加载的过程中会频繁使用到,对于复杂的业务逻辑,可以将数据先存储在临时表,然后再从临时表取值进行进一步计算。

接下来,在虚拟机 Node_03中使用Hive客户端工具Beeline,远程连接虚拟机Node_02的 HiveServer2服务操作Hive,在数据库hive_database中创建临时表temporary_table,具体命令如下。

CREATE TEMPORARY TABLE
hive_database.temporary_table
く
name STRING,
age int,
gender STRING
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS textfile
TBLPROPERTIES("comment"="This is a temporary table");

上述命令执行完成后,在Hive客户端工具Beeline中执行“DESC FORMATTED temporary_table;"命令,查看数据库 hive_database中临时表 temporary_table 的表结构信息,如图所示。

1683535035732_1679556990484_82-(1).jpg

临时表temporary_table的表结构信息

临时表temporary_table在HDFS的数据存储路径为/tmp_local/hive/root目录中,该路径中/tmp_local/hive为Hive配置文件中参数 hive.exec.scratchdir指定的临时目录,/root是根据当前用户名root创建的目录。在Hive客户端工具Beeline中执行“!table”命令退出当前会话,再次使用Hive客户端工具Beeline,在虚拟机Node_03中远程连接虚拟机Node_02的HiveServer2服务时,会发观数据库 hive_database中已经不存在临时表temporary_table。

注意:

(1)临时表不支持分区,不能基于CREATETABLE句式创建临时分区表。

(2)临时表不支持索引。

(3)临时表是数据表的一种展现形式,因此针对数据表的操作同样可以应用于临时表。

(4)如果同一数据库中的临时表与非临时表名称一致,那么此会话内任何操作都会被解析为临时表的操作,用户将无法访问同名的非临时表。

 类似资料:
  • 问题内容: 如何与创建普通表类似地创建临时表? 例子: 问题答案: 临时表可以有3种,是最常用的。这是仅在当前会话中存在的临时表。与之等效的是声明的表变量。它具有较少的“功能”(如索引等),也仅用于当前会话。的是一个是一样的,但是,范围更广,因此您可以在同一会话中使用它,其他的存储过程中。 您可以通过多种方式创建临时表:

  • 问题内容: 为什么SQL Server坚持认为临时表已经存在!一个或另一个将会发生!,所以永远不会这样。 错误是:数据库中已经有一个名为“#temp1”的对象。 有没有解决这个问题的优雅方法?如果@checkvar为null,我要整个表,否则,只给我其中@checkvar =某物的值 编辑:该列是varchar,而不是int。 问题答案: 您不能只重写语句吗?

  • 问题内容: 为什么不能在where子句中使用临时列? 例如,此查询: 这将显示两列,一列称为,另一列称为。是即时创建的,始终为1或0,具体取决于是否有50个或该品牌的产品。 这一切对我来说都是有意义的,除了我不能仅在以下查询中选择时: 这给了我这个错误: 问题答案: 使用来代替: 被评估 前 的。被评估之后。

  • 问题内容: 我目前正在为一家餐馆开发门户应用程序。使用的后端数据库是Mysql,而我正在使用Spring JDBC支持来编写数据访问逻辑。 我的某些DAO充满了多个查询,并且正获得多达数千行的代码。我认为我可以通过将一些逻辑移到SQL- PSM过程中来减少大小和复杂性(因为Java中的数据绑定和粘合代码是令人讨厌的事情)。 但是,我对Db没有DDL权限,因此无法创建该过程。 我想知道是否有一种方法

  • 问题内容: 是否可以通过select语句创建一个临时(仅会话)表,而无需使用create table语句并指定每个列类型?我知道派生表可以做到这一点,但是它们是超临时的(仅用于陈述),我想重用。 如果我不必编写create table命令并保持列列表和类型列表匹配,则可以节省时间。 问题答案: 从位于http://dev.mysql.com/doc/refman/5.7/en/create- ta

  • 问题内容: 我想在Oracle数据库中创建一个临时表 就像是 在SQL Server中 然后用选择语句填充它 是否有可能? 谢谢 问题答案: 是的,Oracle有临时表。这是描述它们的AskTom文章的链接,这是oracle的官方CREATE TABLE文档。 但是,在Oracle中,只有临时表中的 数据 是临时的。该表是其他会话可见的常规对象。在Oracle中频繁创建和删除临时表是一种不好的做法

  • 问题内容: 在C语言中非常常见:像这样入侵“空if语句”: 它在Python中工作吗?我的意思是,我们可以通过使用它来提高应用程序的性能吗?我也想知道为什么。 问题答案: 如果“ if”中没有其他情况,则性能会得到改善,因为字节码不会将执行传递给“ if”情况。 这是一些功能和输出 以下示例应用程序: 分解为: 以下 分解为:

  • 问题内容: 我有以下内容: 创建DB并使用他的前两个 方法工作正常。当到达行中时,它将引发异常- 问题答案: 这应该在您的情况下有效: 原因:每次调用execute方法时,语句只能执行一个SQL语句。 如果要同时执行两个或多个语句,则可以使用Batch-Jobs来执行。 喜欢: