HIVE中的insert和with as配合使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HIVE中的insert和with as配合使用相关的知识,希望对你有一定的参考价值。

参考技术A https://199604.com/967

SQL Server - 在 INSERT 语句中使用 WITH 子句

【中文标题】SQL Server - 在 INSERT 语句中使用 WITH 子句【英文标题】:SQL Server - using the WITH clause in an INSERT statement 【发布时间】:2013-03-12 13:00:41 【问题描述】:

我想知道这是否可能。我有一个现有查询,它使用WITH 子句将一些聚合数据应用于SELECT 查询,如下所示:(大量简化)

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

我现在想把INSERT这个查询的结果放到另一个表中。

我尝试了以下方法:

INSERT INTO tablea(a,b)
;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
SELECT y, z FROM alias

但我得到了错误:

';' 附近的语法不正确。

所以我尝试不使用分号但收到错误:

关键字“WITH”附近的语法不正确。

关键字“with”附近的语法不正确。如果该语句是公用表表达式或 xmlnamespaces 子句,则前面的语句必须以分号结束。

我试图用不同的语法来做可能吗?

【问题讨论】:

分号位于语句的结尾。把它放在前面是一个坏习惯,你应该习惯用分号正确地结束每个语句。 您是否检查了documentation 中的INSERT 语句?它表明 CTE 位于 INSERT 之前,并包含一个使用 CTE 的示例。 【参考方案1】:

您需要将INSERT INTO 放在CTE 之后。所以代码将是:

;WITH alias (y,z)
AS
(
    SELECT y,z FROM tableb
)
INSERT INTO tablea(a,b)
SELECT y, z 
FROM alias

见SQL Fiddle with Demo

【讨论】:

【参考方案2】:

另一种不使用CTE 的方法是将其包装在子查询中,

INSERT INTO tablea(a,b)
SELECT y, z 
FROM 
(
    SELECT y,z FROM tableb
) alias

【讨论】:

@KSTech 好问题。我在想 OP 只是在简化问题。【参考方案3】:

分号用于终止语句。因此,当您使用 ;WITH 时,会终止前一个语句。但是,这不是您在此处收到错误的原因。这里的问题在于您的 INSERT INTO 语句,它正在寻找 VALUES 或 SELECT 语法。

INSERT INTO 语句有两种使用方式 - 显式提供 VALUES 或使用 SELECT 语句提供结果集。

【讨论】:

以上是关于HIVE中的insert和with as配合使用的主要内容,如果未能解决你的问题,请参考以下文章

大数据之Hive:with tmp1 as ()

SQL Server - 在 INSERT 语句中使用 WITH 子句

with as 语句真的会把数据存内存嘛?(源码剖析)

hbase可以访问hive里面的表吗

在插入语句中使用语句 HIVE EMR AWS

SQL 中with的用法