我的資料如下所示
行程表
| SERNR | 型別 |
|---|---|
| 123 | 空值 |
| 456 | 空值 |
| 789 | 空值 |
段表
| SERNR | 警戒線 | 從站 | 轉站 |
|---|---|---|---|
| 123 | 01 | 一個 | 乙 |
| 123 | 02 | 乙 | C |
| 123 | 03 | C | 乙 |
| 123 | 04 | 乙 | 一個 |
| 456 | 01 | 一個 | 乙 |
| 456 | 02 | 乙 | C |
| 456 | 03 | C | D |
| 456 | 04 | D | 一個 |
| 789 | 04 | 一個 | 乙 |
我想加入這兩個資料框/表并檢查旅程站FROM并TO 決定旅程型別,即如果它的回程是某種型別,A如果它的鏡像回傳某種型別B,如果它是某種型別的單程旅程C
型別計算如下
假設對于旅程SERNR 123,旅程細節是A->B , B->C, C->B,B->A,這是一個鏡像旅程,因為它的AB-C然后是CB-A。
對于789,它的A->B所以它是一個正常的旅程。
對于456其A-> B, B->C , C->D , DA,簡而言之ABC然后CDA , 這是回報但不是鏡子
我真的不知道如何比較Dataframe中的行,SERNR以通過檢查FROM和To站相同來決定型別SERNR
真的很感激如果我能得到一個指標來繼續執行相同的操作。
uj5u.com熱心網友回復:
您可以將每個 的FROM TO旅程串列收集到一個陣列列中SERNR,然后將陣列元素連接起來得到一個journey_path( A-B-C...)。
當您獲得每個旅程的旅程路徑時,您可以使用when運算式來確定TYPE:
- 如果第一個 FROM != last TO 那么它是
normal - else : 如果 travel_path 的反向 == travel_path
mirror否則它是一個return
注意在對FROM - TOs的串列進行分組和收集時,需要使用一個Window來保持segment的順序。
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("SERNR").orderBy("Sgmnt").rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)
val result = segment_df.select(
col("SERNR"),
array_join(
collect_list(concat_ws("-", col("FROM"), col("TO"))).over(w),
"-"
).alias("journey_path")
).dropDuplicates(Seq("SERNR")).withColumn(
"TYPE",
when(
substring(col("journey_path"), 0, 1) =!= substring(col("journey_path"), -1, 1),
"normal"
).otherwise(
when(
reverse(col("journey_path")) === col("journey_path"),
"mirror"
).otherwise("return")
)
)
.drop("journey_path")
result.show
// ----- ------
//|SERNR| TYPE|
// ----- ------
//| 789|normal|
//| 456|return|
//| 123|mirror|
// ----- ------
uj5u.com熱心網友回復:
使用 from_ station 或 to_station 的 cllect_list 將其與 SERNR 分組并按段排序
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/384971.html
上一篇:如何在Databricks上本地保存Great_Expectations套件(社區版)
下一篇:洗掉不需要的字符并獲取新列
