我想創建一個布爾列,如果特定日期列的子集包含一年中的所有月份,則回傳 True。
例子:
id date
a 2021-01-01
a 2021-02-01
...
a 2021-12-01
b 2021-02-01
b 2021-04-01
看起來像:
id date full_year
a 2021-01-01 yes
a 2021-02-01 yes
... ...
a 2021-12-01 yes
b 2021-02-01 no
b 2021-04-01 no
uj5u.com熱心網友回復:
進口:
from pyspark.sql import functions as F, Window as W
代碼:
w = W.partitionBy("id",F.year("date"))
out = (sdf.withColumn("date",F.to_date("date"))
.withColumn("CountYearMOnth",
F.size(F.collect_set(F.date_format("date","yyyyMM")).over(w)))
.withColumn("full_year",F.when(F.col("CountYearMOnth")==12,"yes").otherwise("No"))
.drop("CountYearMOnth")
)
邏輯:
- 按 id 和 year 列磁區并創建一個視窗 (w)
- 將日期列轉換為實際日期列(如果型別是日期列則忽略)
- 在視窗 (w) 上收集集并獲取日期列的大小,格式為 yyyymm,條件如下
- 如果 size == 12,則分配 Yes 否則分配 No
或者,您可以用大約不同的計數替換收集串列的大小:
w = W.partitionBy("id",F.year("date"))
out = (sdf.withColumn("date",F.to_date("date"))
.withColumn("CountYearMOnth",
F.approx_count_distinct(F.date_format("date","yyyyMM")).over(w))
.withColumn("full_year",F.when(F.col("CountYearMOnth")==12,"yes").otherwise("No"))
.drop("CountYearMOnth")
)
樣本輸出:
--- ---------- ---------
|id |date |full_year|
--- ---------- ---------
|a |2021-01-31|yes |
|a |2021-02-28|yes |
|a |2021-03-31|yes |
|a |2021-04-30|yes |
|a |2021-05-31|yes |
|a |2021-06-30|yes |
|a |2021-07-31|yes |
|a |2021-08-31|yes |
|a |2021-09-30|yes |
|a |2021-10-31|yes |
|a |2021-11-30|yes |
|a |2021-12-31|yes |
|a |2022-01-31|No |
|a |2022-02-28|No |
|a |2022-03-31|No |
|a |2022-04-30|No |
|b |2021-01-31|No |
|b |2021-02-28|No |
|b |2021-03-31|No |
|b |2021-04-30|No |
|b |2021-05-31|No |
|b |2021-06-30|No |
--- ---------- ---------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/444553.html
