Impala - 在 WITH 子句之后创建 TABLE

Posted

技术标签:

【中文标题】Impala - 在 WITH 子句之后创建 TABLE【英文标题】:Impala - CREATE TABLE after a WITH clause 【发布时间】:2019-02-15 12:18:06 【问题描述】:

我有一个带有几个 WITH 子句的查询,然后是一个 CREATE TABLE

    WITH TABLE_1 AS (
        SELECT * FROM SOMEWHERE_1
    ), TABLE_2 AS (
        SELECT * FROM SOMEWHERE_2

    (
        CREATE TABLE TABLE_3 AS
        (
            SELECT TABLE_1.*, TABLE_2.*
            FROM TABLE_1 
            INNER JOIN TABLE_2 ON TABLE_2.key = TABLE_1.key
        )
    )

但是我有以下错误:

遇到:CREATE 预期:SELECT、VALUES、WITH CAUSED BY:异常:语法错误

所以我尝试将 CREATE 语句放在首位:

    CREATE TABLE_3 AS
    (
        WITH TABLE_1 AS (
            SELECT * FROM SOMEWHERE_1
        ), TABLE_2 AS (
            SELECT * FROM SOMEWHERE_2

        (
            SELECT TABLE_1.*, TABLE_2.*
            FROM TABLE_1 
            INNER JOIN TABLE_2 ON TABLE_2.key = TABLE_1.key
        )
    )

但现在我有以下错误:

AnalysisException:无法解析表引用:'TABLE_1'

请注意:

上述查询在没有“CREATE”语句的情况下也可以工作 我现在的情况比这个简单的例子更复杂,为了清楚起见,我想保留 WITH 语句。

【问题讨论】:

【参考方案1】:

嗯。我认为这会奏效:

CREATE TABLE TABLE_3 AS
    WITH TABLE_1 AS (
          SELECT * FROM SOMEWHERE_1
         ),
         TABLE_2 AS (
          SELECT * FROM SOMEWHERE_2
         )
    SELECT TABLE_1.*, TABLE_2.*
    FROM TABLE_1 INNER JOIN
         TABLE_2
         ON TABLE_2.key = TABLE_1.key;

当然,您还会遇到其他问题,例如key 列在结果中重复——这应该会产生另一个错误。在实践中,您应该准确地选择您想要的列。

【讨论】:

我不确定为什么我的第二次尝试失败了,但您的解决方案有效。非常感谢。 这应该会失败。语法不正确。 Create table <tablename> 是正确的语法 @XING 。 . .谢谢。【参考方案2】:

或者,你也可以这样做......

WITH TABLE_1 AS (
      SELECT * FROM SOMEWHERE_1
     ),
     TABLE_2 AS (
      SELECT * FROM SOMEWHERE_2
     )
SELECT TABLE_1.*, TABLE_2.* INTO TABLE_3
FROM TABLE_1 INNER JOIN
     TABLE_2
     ON TABLE_2.key = TABLE_1.key

强烈建议随时准备好 DDL 并运行 INSERT INTO TABLE SELECT * FROM CTE

【讨论】:

以上是关于Impala - 在 WITH 子句之后创建 TABLE的主要内容,如果未能解决你的问题,请参考以下文章

哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器

Impala 或 Hive 在其他 SQL 语法中是不是有类似 IN 子句的东西?

Oracle 使用 with 子句创建表

Impala:AnalysisException:LEFT OUTER JOIN 需要 ON 或 USING 子句

SQL/Impala:将多个查询(具有不同的 where 子句)合并为一个

索引问题:Select * with WHERE 子句。在哪里以及如何创建索引