【问题标题】:Type 'INTERVAL' are not supported in Spark SQL 2.4.3 - What is workaround?Spark SQL 2.4.3 不支持“INTERVAL”类型 - 什么是解决方法?
【发布时间】:2020-10-14 09:27:33
【问题描述】:

编辑显然 Spark 2.4.3 不支持 INTERVAL。我暂时无法升级到 Spark 3.0.0(管理员策略)。我想知道目前是否有针对 INTERVAL 的解决方法或交替方法?谢谢

在 Databricks 中对 Spark sql 运行查询,查询在间隔行上显示错误。我试图在同一个用户 ID 上自行左加入表,并且用户数相差一个月。

Error in SQL statement: ParseException: 
Literals of type 'INTERVAL' are currently not supported.

Spark SQL 不支持区间函数吗?

这是我的尝试:

%sql


;WITH act_months AS (
  SELECT DISTINCT
    DATE_TRUNC('month', data_date) ::DATE AS act_month,
    user_id
  FROM user_sessions)

SELECT
  prev.act_month,
  prev.user_id,
  curr.user_id IS NULL AS churned_next_month
FROM act_months AS prev
LEFT JOIN act_months AS curr
  ON prev.user_id = curr.user_id
 AND prev.act_month = (curr.act_month - INTERVAL '1 MONTH')
ORDER BY prev.act_month ASC, prev.user_id ASC;

这是我的数据结构

+----------+----------+
| data_date|   user_id|
+----------+----------+
|2020-01-01|22600560aa|  
|2020-01-01|17148900ab|     
|2020-01-01|21900230aa|    
|2020-01-01|35900050ac|    
|2020-01-01|22300280ad|     
|2020-01-02|19702160ac|     
|2020-02-02|17900020aa|    
|2020-02-02|16900120aa|    
|2020-02-02|11160900aa|    
|2020-03-02|16900290aa|    
+----------+----------+

【问题讨论】:

  • 您运行的是什么版本的 Spark?您是否启用了 ANSI 合规模式?
  • Spark 确实支持 INTERVAL,但您需要运行 3.0.0 或更高版本,并在 ISO SQL-2011 的 ANSI 兼容模式下运行。
  • 运行 Spark 2.4.3
  • 那么你需要升级到 Spark 3.0.0 以获得INTERVAL 的支持。
  • 抱歉,我指的是ADD_MONTHS,而不是DATEDIFF

标签: apache-spark apache-spark-sql databricks


【解决方案1】:

(免责声明:我不是 Spark 用户 - 这是我重新发布我的评论作为答案):

  • 根据我对 Spark 文档的阅读,INTERVAL 仅支持 Spark 3.0.0 或更高版本。
    • 您说您运行的是 Spark 2.4.3,因此您的系统不支持 INTERVAL
  • 但是您可以使用受支持的ADD_MONTHS(和DATE_ADDby (at least) Spark 2.3.0

试试这个:

;WITH q AS (

    SELECT
        DISTINCT
        DATE_TRUNC( data_date, 'month' ) AS act_year_month, -- DATE_TRUNC( $dt, 'month' ) returns a datetime value with only the YEAR and MONTH components set, all other components are zeroed out.
        user_id
    FROM
        user_sessions
)

SELECT
    prev.act_year_month,
    prev.user_id,
    ( curr.user_id IS NULL ) AS churned_next_month
FROM
    q AS prev
    LEFT JOIN q AS curr ON
        prev.user_id = curr.user_id
        AND
        prev.act_year_month = ADD_MONTHS( curr.act_year_month, -1 )

ORDER BY
    prev.act_year_month,
    prev.user_id;

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2012-04-14
    • 2012-02-01
    • 2011-03-12
    • 2017-02-03
    • 2014-12-06
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多