我有一个输入:
+---------+-------+--------+----------+----------+
|timestamp|user_id|results |event_name|product_id|
+---------+-------+--------+----------+----------+
|1000 |user_1 |result 1|Click |1 |
|1001 |user_1 |result 1|View |1 |
|1002 |user_1 |result 2|Click |3 |
|1003 |user_1 |result 2|View |4 |
|1004 |user_1 |result 2|View |5 |
+---------+-------+--------+----------+----------+
root
|-- timestamp: timestamp (nullable = true)
|-- user_id: string (nullable = true)
|-- results: string (nullable = true)
|-- event_name: string (nullable = true)
|-- product_id: string (nullable = true)
我想将此转换为以下内容,以确保保留用户标识和结果的唯一组合,并根据给定的事件名称聚合产品标识,如下所示:
+-------+--------+---------------+---------------+
|user_id|results |product_clicked|products_viewed|
+-------+--------+---------------+---------------+
|user_1 |result 1|[1] |[1] |
|user_1 |result 2|[4,5] |[3] |
+-------+--------+---------------+---------------+
root
|-- user_id: string (nullable = true)
|-- results: string (nullable = true)
|-- product_clicked: array (nullable = true)
| |-- element: string (containsNull = true)
|-- products_viewed: array (nullable = true)
| |-- element: string (containsNull = true)
我已经研究了pivot,它很接近,但我不需要它的聚合部分,而是需要在基于event\u name column创建的列上创建数组。我们不知道怎么做。
注意:上面的“产品点击”和“产品查看”列中的顺序很重要,并且基于输入Dataframe的“时间戳”列。
1条答案
按热度按时间yrdbyhpb1#
你可以用
collect_list
在数据透视聚合期间:为了确保排序,您可以收集包含时间戳的结构列表,对列表进行排序,并将列表转换为仅保留产品标识: