解决方法是什么?

nzrxty8p  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(501)

编辑:spark 2.4.3不支持间隔。我暂时无法升级到spark 3.0.0(管理策略)。我想知道是否有一个解决办法或交替方法的间歇目前?谢谢
在databricks中运行sparksql查询,查询在间隔行上显示错误。我试图在同一个用户id上左键联接表本身,并且用户数相差一个月。

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

spark sql不支持interval函数吗?
以下是我的尝试:

%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|    
+----------+----------+
bkkx9g8r

bkkx9g8r1#

(免责声明:我不是spark用户-这是我重新发布我的评论作为答案):
从我阅读spark的文件来看, INTERVAL 仅由spark 3.0.0或更高版本支持。
你说你在运行spark 2.4.3,所以 INTERVAL 您的系统不支持。
但是你可以使用 ADD_MONTHS (和 DATE_ADD )由(至少)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;

相关问题