0

编辑显然 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|    
+----------+----------+
4

1 回答 1

2

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

  • 根据我对 Spark 文档的阅读,INTERVAL仅 Spark 3.0.0 或更高版本支持。
    • 您说您正在运行 Spark 2.4.3,因此INTERVAL您的系统不支持。
  • 但是,您可以使用(至少)Spark 2.3.0支持的ADD_MONTHS(and ) 。DATE_ADD

试试这个:

;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;
于 2020-06-24T12:12:19.797 回答