我正在研究火花資料框。輸入資料框如下所示(表 1)。我需要撰寫一個邏輯來獲取每個會話 ID 的最大長度的關鍵字。有多個關鍵字將成為每個 sessionid 的輸出的一部分。預期輸出如表 2 所示。
輸入資料框:
(Table 1)
|----------- ------------ -----------------------------------|
| session_id| value | Timestamp |
|----------- ------------ -----------------------------------|
| 1 | cat | 2021-01-11T13:48:54.2514887-05:00 |
| 1 | catc | 2021-01-11T13:48:54.3514887-05:00 |
| 1 | catch | 2021-01-11T13:48:54.4514887-05:00 |
| 1 | par | 2021-01-11T13:48:55.2514887-05:00 |
| 1 | part | 2021-01-11T13:48:56.5514887-05:00 |
| 1 | party | 2021-01-11T13:48:57.7514887-05:00 |
| 1 | partyy | 2021-01-11T13:48:58.7514887-05:00 |
| 2 | fal | 2021-01-11T13:49:54.2514887-05:00 |
| 2 | fall | 2021-01-11T13:49:54.3514887-05:00 |
| 2 | falle | 2021-01-11T13:49:54.4514887-05:00 |
| 2 | fallen | 2021-01-11T13:49:54.8514887-05:00 |
| 2 | Tem | 2021-01-11T13:49:56.5514887-05:00 |
| 2 | Temp | 2021-01-11T13:49:56.7514887-05:00 |
|----------- ------------ -----------------------------------|
預期輸出:
(Table 2)
|----------- ------------
| session_id| value |
|----------- ------------
| 1 | catch |
| 1 | partyy |
| 2 | fallen |
| 2 | Temp |
|----------- ------------|
我試過的解決方案:
我添加了另一個名為 col_length 的列,它捕獲 value 列中每個單詞的長度。后來嘗試將每一行與其后續行進行比較,以查看它是否具有最大長度。但這個解決方案只適用于一方。
val df = spark.read.parquet("/project/project_name/abc")
val dfM = df.select($"session_id",$"value",$"Timestamp").withColumn("col_length",length($"value"))
val ts = Window
.orderBy("session_id")
.rangeBetween(Window.unboundedPreceding, Window.currentRow)
val result = dfM
.withColumn("running_max", max("col_length") over ts)
.where($"running_max" === $"col_length")
.select("session_id", "value", "Timestamp")
電流輸出:
|----------- ------------
| session_id| value |
|----------- ------------
| 1 | catch |
| 2 | fallen |
|----------- ------------|
多列在帶有視窗函式的 orderBy 子句中不起作用,所以我沒有得到想要的輸出。每個 sesison id 有 1 個輸出。任何建議將不勝感激。提前致謝。
uj5u.com熱心網友回復:
您可以使用lead函式解決它:
val windowSpec = Window.orderBy("session_id")
dfM
.withColumn("lead",lead("value",1).over(windowSpec))
.filter((functions.length(col("lead")) < functions.length(col("value"))) || col("lead").isNull)
.drop("lead")
.show
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447331.html
