[英]spark scala: add a new column that has a list as a value; the list should verify a specific condition
我有以下查詢:
finvResultOutput1
.withColumn("offersAtSite",when(col("activeIOsAtSite")==="Y",
finvResultOutput1.select(col("OfferSpecification_displayLabel"),col("Site_siteId").alias("siteid"))
.where(col("Site_siteId")===col("siteid"))
.drop("siteid")
.collect()
))
我想在我的數據框中添加一個名為offersAtSite
的新列,當另一個名為activeIOsAtSite
列等於"Y"
時,應該添加此列。
這個新列的值應該是一個列表,沒有重復列OfferSpecification_displayLabel
的元素,其中Site_siteId
等於我們正在迭代的行的當前Site_siteId
。
誰能給我一個更好的方法來做到這一點,因為我所做的查詢花費了太多時間,我不知道它是否有效
貝婁是我想要實現的一個例子:
首先,您可以在主表上進行groupBy
然后collect_set
(集合不包含重復項):
val grouped = df.groupBy("Site_siteId").agg(collect_set("OfferSpecifications_displayLabel").as("offerAtSite"))
我們得到:
+-----------+------------------------+
|Site_siteId|offerAtSite |
+-----------+------------------------+
|site_id_3 |[site3_DL_1, site3_DL_2]|
|site_id_4 |[site4_DL_1] |
|site_id_2 |[site2_DL_1] |
|site_id_1 |[site1_DL_1, site1_DL_2]|
+-----------+------------------------+
然后,我們將我們的df
表加入grouped
並覆蓋offerAtSite
以僅具有Y
值的值:
df.join(grouped, Seq("Site_siteId"), "left")
.withColumn("offerAtSite", when(col("activeIOsAtSite").equalTo("Y"), col("offerAtSite")))
最后結果:
+-----------+---------------+--------------------------------+------------------------+
|Site_siteId|activeIOsAtSite|OfferSpecifications_displayLabel|offerAtSite |
+-----------+---------------+--------------------------------+------------------------+
|site_id_3 |Y |site3_DL_1 |[site3_DL_1, site3_DL_2]|
|site_id_3 |Y |site3_DL_2 |[site3_DL_1, site3_DL_2]|
|site_id_4 |N |site4_DL_1 |null |
|site_id_2 |N |site2_DL_1 |null |
|site_id_1 |Y |site1_DL_1 |[site1_DL_1, site1_DL_2]|
|site_id_1 |Y |site1_DL_2 |[site1_DL_1, site1_DL_2]|
+-----------+---------------+--------------------------------+------------------------+
這應該會更好,祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.