apache-spark - 在 Spark 中与 groupBy 一起使用领先和滞后函数的可能性
问题描述
我很有趣有没有办法使用领先\滞后来计算这样的东西
第一步:我有一个数据框
+----+-----------+------+
| id | timestamp | sess |
+----+-----------+------+
| xx | 1 | A |
+----+-----------+------+
| yy | 2 | A |
+----+-----------+------+
| zz | 1 | B |
+----+-----------+------+
| yy | 3 | B |
+----+-----------+------+
| tt | 4 | B |
+----+-----------+------+
我想通过 session_id 收集特定 id 分区之前的 id
+----+---------+
| id | id_list |
+----+---------+
| yy | [xx,zz] |
+----+---------+
| xx | [] |
+----+---------+
| zz | [] |
+----+---------+
| tt | [yy] |
+----+---------+
解决方案
您可以在问题中提到window
的列sess
和ID 上创建一个。lag
然后您可以使用groupBy
聚合函数collect_list
来获取输出。
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy($"sess").orderBy($"timestamp")
val df1 = df.withColumn("lagged", lag($"id", 1).over(w))
df1.select("id", "lagged").groupBy($"id").agg(collect_list($"lagged").as("id_list")).show
//+---+--------------------+
//| id| id_list|
//+---+--------------------+
//| tt| [yy]|
//| xx| []|
//| zz| []|
//| yy| [zz, xx]|
//+---+--------------------+
推荐阅读
- python - 将 2 个等高线图的大小调整为彩条的高度
- javascript - Extjs - 如何在面板上的固定位置添加工具提示
- ios - 使用 Cordova 在 iOS 上部署白屏 AngularApp
- powerbi - 将范围的第一天设置为初始库存 + 生产 - 销售 = 库存 (DAX)
- tkinter - 为什么我的 tkinter.Toplevel 小部件不会出现?
- angular - Redux:没有重载匹配此调用
- css - 未从公用文件夹在 Laravel 中加载 CSS 文件
- java - 我在线程“main”java.util.NoSuchElementException 中遇到异常:找不到行
- python - Pandas:如何添加一个额外的列来指示是否有 nan 数据
- c - 类似于 GCC 的 IAR __stackless