【问题标题】:SparkSQL cannot run a simple SQL querySparkSQL 无法运行简单的 SQL 查询
【发布时间】:2022-01-19 14:48:08
【问题描述】:

我正在处理一个简单的 SparkSQL 查询:

SELECT
    *,
    (DATE + DURATION) AS EXPIRY_MONTH
FROM
    loan
WHERE
    EXPIRY_MONTH >= 12

loan 表的前 10 行如下:

"loan_id";"account_id";"date";"amount";"duration";"payments";"status"
5314;1787;930705;96396;12;8033.00;"B"
5316;1801;930711;165960;36;4610.00;"A"
6863;9188;930728;127080;60;2118.00;"A"
5325;1843;930803;105804;36;2939.00;"A"
7240;11013;930906;274740;60;4579.00;"A"
6687;8261;930913;87840;24;3660.00;"A"
7284;11265;930915;52788;12;4399.00;"A"
6111;5428;930924;174744;24;7281.00;"B"
7235;10973;931013;154416;48;3217.00;"A"

此查询适用于 SQLite(意味着添加列 EXPIRY_MONTH 并根据条件 EXPIRY_MONTH >= 12 过滤数据)但不适用于 SparkSQL (Spark 3.1.0)。

具体来说,SparkSQL 引擎会抛出错误,因为 EXPIRY_MONTH 列不存在。

如何在不使用子查询的情况下修复此查询?

这种行为的原因是什么?SparkSQL 与更标准的 SQL 有什么区别?

【问题讨论】:

    标签: sql select apache-spark-sql


    【解决方案1】:

    您无法运行此查询,因为 spark 是延迟评估的,它不会找到您在 where 子句中创建的列。

    您可以做的是使用与您应用相同的逻辑在 where 子句中创建单独的列,这将允许您在不使用子查询的情况下运行查询。

    SELECT
        *,
        (DATE + DURATION) AS EXPIRY_MONTH
    FROM
        loan
    WHERE
        (DATE + DURATION) >= 12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2017-02-26
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多