【发布时间】:2020-05-16 03:17:03
【问题描述】:
我的 df 是按会话和时间戳排序的,如下所示;
df = spark.createDataFrame(
[[1, '2020-01-01 12:30:00.000', 'foo'], [1, '2020-01-01 12:31:00.000', 'bar'], [1, '2020-01-01 12:32:00.000', 'foo'],
[1, '2020-01-01 12:33:00.000', 'foo'], [2, '2020-01-01 13:00:00.000', 'bar'], [2, '2020-01-01 13:01:00.000', 'foo'],
[2, '2020-01-01 13:02:00.000', 'bar'], [2, '2020-01-01 13:03:00.000', 'foo']],
['session_id', 'timestamp', 'event']
)
df.show(truncate=False)
+----------+-----------------------+-----+
|session_id|timestamp |event|
+----------+-----------------------+-----+
|1 |2020-01-01 12:30:00.000|foo |
|1 |2020-01-01 12:31:00.000|bar |
|1 |2020-01-01 12:32:00.000|foo |
|1 |2020-01-01 12:33:00.000|foo |
|2 |2020-01-01 13:00:00.000|bar |
|2 |2020-01-01 13:01:00.000|foo |
|2 |2020-01-01 13:02:00.000|bar |
|2 |2020-01-01 13:03:00.000|foo |
+----------+-----------------------+-----+
我希望我的会话遵循特定模式。他们需要从事件“bar”开始并拥有一个(或多个)“foo”事件。每当发生新的“酒吧”事件时,我想将其归类为新会话。不属于这种模式的事件应该被丢弃,例如最初的 'foo' 事件。 所需的输出应如下所示:
df_res = spark.createDataFrame(
[[1, '2020-01-01 12:31:00.000', 'bar'], [1, '2020-01-01 12:32:00.000', 'foo'],
[1, '2020-01-01 12:33:00.000', 'foo'], [2, '2020-01-01 13:00:00.000', 'bar'], [2, '2020-01-01 13:01:00.000', 'foo'],
[3, '2020-01-01 13:02:00.000', 'bar'], [3, '2020-01-01 13:03:00.000', 'foo']],
['session_id', 'timestamp', 'event']
)
df_res.show(truncate=False)
+----------+------------------------+-----+
|session_id|timestamp |event|
+----------+------------------------+-----+
|1 |2020-01-01 12:31:00.000 |bar |
|1 |2020-01-01 12:32:00.000 |foo |
|1 |2020-01-01 12:33:00.000 |foo |
|2 |2020-01-01 13:00:00.000 |bar |
|2 |2020-01-01 13:01:00.000 |foo |
|3 |2020-01-01 13:02:00.000 |bar |
|3 |2020-01-01 13:03:00.000 |foo |
+----------+------------------------+-----+
我尝试过执行 groupby 和 collect_list,然后拆分或展平,但我不确定如何继续。欢迎任何帮助!
df.groupBy("session_id").agg(F.collect_list("event").alias("list_event"))
#does not work
# tst_udf = udf(lambda l: split(l, 'bar'))
# df = df.withColumn("tst", tst_udf(col('list_event')))
-编辑 我的最终目标是旋转该表并在每个会话中保留一行,其中我有关于“bar”和(多个)“foo”事件的变量。
【问题讨论】:
-
订购窗口函数需要时间戳,请将其添加到您的示例数据中。
-
现在添加时间戳。
标签: python pyspark apache-spark-sql