【问题标题】:Does Spark support subqqueries? [duplicate]Spark 支持子查询吗? [复制]
【发布时间】:2015-10-29 12:07:41
【问题描述】:

当我运行这个查询时,我得到了这种类型的错误

  select * from raw_2 where ip NOT IN (select * from raw_1);

org.apache.spark.sql.AnalysisException:

查询中不支持的语言功能:

 select * from raw_2 where ip NOT IN (select * from raw_1)
  TOK_QUERY 1, 0,24, 14
    TOK_FROM 1, 4,6, 14
      TOK_TABREF 1, 6,6, 14
        TOK_TABNAME 1, 6,6, 14
          raw_2 1, 6,6, 14
    TOK_INSERT 0, -1,24, 0
      TOK_DESTINATION 0, -1,-1, 0
       TOK_DIR 0, -1,-1, 0
          TOK_TMP_FILE 0, -1,-1, 0
      TOK_SELECT 0, 0,2, 0
        TOK_SELEXPR 0, 2,2, 0
          TOK_ALLCOLREF 0, 2,2, 0
      TOK_WHERE 1, 8,24, 29
       NOT 1, 10,24, 29
          TOK_SUBQUERY_EXPR 1, 14,10, 33
            TOK_SUBQUERY_OP 1, 14,14, 33
              IN 1, 14,14, 33
            TOK_QUERY 1, 16,24, 51
              TOK_FROM 1, 21,23, 51
                TOK_TABREF 1, 23,23, 51
                  TOK_TABNAME 1, 23,23, 51
                    raw_1 1, 23,23, 51
              TOK_INSERT 0, -1,19, 0
          TOK_DESTINATION 0, -1,-1, 0
            TOK_DIR 0, -1,-1, 0
              TOK_TMP_FILE 0, -1,-1, 0
          TOK_SELECT 0, 17,19, 0
            TOK_SELEXPR 0, 19,19, 0
              TOK_ALLCOLREF 0, 19,19, 0
      TOK_TABLE_OR_COL 1, 10,10, 26
        ip 1, 10,10, 26

scala.NotImplementedError:无 ASTNode 类型的解析规则:817,文本:

  TOK_SUBQUERY_EXPR :
  TOK_SUBQUERY_EXPR 1, 14,10, 33
    TOK_SUBQUERY_OP 1, 14,14, 33
      IN 1, 14,14, 33
    TOK_QUERY 1, 16,24, 51
      TOK_FROM 1, 21,23, 51
        TOK_

【问题讨论】:

    标签: hadoop apache-spark hive presto


    【解决方案1】:

    Spark 2.0.0+

    从 2.0.0 开始,Spark 支持全范围的子查询。详情请见Does SparkSQL support subquery?

    火花

    Spark 是否支持子查询?

    一般来说是这样。像 SELECT * FROM (SELECT * FROM foo WHERE bar = 1) as tmp 这样的构造在 Spark SQL 中完全有效的查询。

    据我所知,the Catalyst parser source 不支持 NOT IN 子句中的内部查询:

    | termExpression ~ (NOT ~ IN ~ "(" ~> rep1sep(termExpression, ",")) <~ ")" ^^ {
        case e1 ~ e2 => Not(In(e1, e2))
      }
    

    仍然可以使用外连接后跟过滤器来获得相同的效果。

    【讨论】:

    • SELECT col FROM (SELECT a + b AS col from t1) t2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2013-09-11
    相关资源
    最近更新 更多