我需要进行用户级别的分析。由于每个用户数据有很多不同的行(与不同的事件相关),因此我需要按用户分组并创建一些代表不同行的计算字段。字段之一是计算自用户上次购买以来的天数(今天-上次购买日期)。我已经尝试了很多不同的代码,也做了很多研究,但是找不到解决方案。
对我来说有意义但不起作用的代码如下:
SELECT CASE WHEN LAST(tr_orderid <> "") THEN
DATEDIFF(CURRENT_DATE(),event_date) ELSE NULL END AS recency_lastbooking
FROM df
GROUP BY domain_userid
SELECT IF(LAST(tr_total > 0), DATEDIFF(CURRENT_DATE(),event_date), NULL)
AS recency_lastbooking
FROM df
GROUP BY domain_userid
我得到的错误是:表达式'event_date'在GROUP BY列表中不存在
我认为如果我使用LAST(event_date),查询将返回特定用户所有行中的最后日期,而不是返回用户发生购买事件的最后一天。
PS:我可以使用tr_total(总交易)> 0或tr_orderid(交易订单ID)<>“”
谢谢!
答案 0 :(得分:2)
我认为您只需要一个窗口函数:
val arrSchema = df.schema(1).dataType // ArrayType(StructType(StructField(x,DoubleType,true), StructField(y,DoubleType,true)),true)
val emptyArr = udf(() => Seq.empty[Any],arrSchema)
df
.withColumn("arr",when($"arr".isNull,emptyArr()).otherwise($"arr"))
.show()
+---+-----------+
| id| arr|
+---+-----------+
| 1|[[1.0,2.0]]|
| 2| []|
+---+-----------+