【问题标题】:Divide data by session start/finish value将数据除以会话开始/结束值
【发布时间】:2020-05-10 01:11:39
【问题描述】:

我有以下数据集:

usr_id, event_time, type_of_event, options
1, 2019-01-01 20:00:00, session_started, option1
1, 2019-01-01 20:00:01, session_continue, option2
1, 2019-01-01 20:00:02, session_finished
1, 2019-01-01 20:00:01, session_started, option3
1, 2019-01-01 20:00:02, session_finished

作为输出,我想做这样的事情:

usr_id, session_id, options
1, unique_session_id1, [option1, option2]
1, unique_session_id2, [option3]

我尝试了一些窗口功能,但没有帮助。

【问题讨论】:

  • 使用 groupBy 函数

标签: sql scala apache-spark


【解决方案1】:

我已将 concate 用于唯一的 session_id。你可以用你的逻辑替换它以获得独特的session_id

scala> import org.apache.spark.sql.expressions.Window
scala> val W1  = Window.partitionBy("usr_id").orderBy("usr_id")
scala> val W2  = Window.partitionBy("usr_id").rowsBetween(Window.unboundedPreceding, Window.currentRow)
scala> df.show()
+------+------------------+----------------+-------+
|usr_id|        event_time|   type_of_event|options|
+------+------------------+----------------+-------+
|     1|2019-01-0120:00:00| session_started|option1|
|     1|2019-01-0120:00:01|session_continue|option2|
|     1|2019-01-0120:00:02|session_finished|   null|
|     1|2019-01-0120:00:01| session_started|option3|
|     1|2019-01-0120:00:02|session_finished|   null|
+------+------------------+----------------+-------+

scala> df.withColumn("temp", when(lag(col("type_of_event"),1).over(W1) === "session_finished", lit(1)).otherwise(lit(0)))
         .withColumn("temp1", sum("temp").over(W2))
         .groupBy("usr_id", "temp1")
         .agg(concat(concat_ws("_",collect_list(col("options"))),lit("_"), col("temp1")).alias("session_id"), collect_list(col("options")).alias("options"))
         .drop("temp1")
         .show()
+------+-----------------+------------------+
|usr_id|       session_id|           options|
+------+-----------------+------------------+
|     1|option1_option2_0|[option1, option2]|
|     1|        option3_1|         [option3]|
+------+-----------------+------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2021-12-15
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多