[英]Select a record from multiple with preference hierarchy from spark dataframe or sql
我有一個具有不同類別的相同產品的產品數據框。 我只想根據層次結構選擇一條記錄
Product ID. Category. Status
1. Cat1. status1
1. Cat2. status1
1. Cat3. status1
2. Cat1. status1
2. Cat2. status1
3. Cat2. status1
如果存在 Cat1 的記錄,則選擇它,否則選擇 Cat2。 如果 Cat2 不存在,請選擇 Cat3。 但只能從多個中選擇一個。
使用row_number()
:
select t.*
from (select t.*, row_number () over (partition by productid order by category) as seq
from table t
) t
where seq = 1;
如果類別名稱不同,則用case
表達式
order by (case when category = 'category_x' then 1
when category = 'category_gg' then 2
else 3
end)
這是使用數據幀函數與@Yogesh Sharma 相同的答案。
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("Product ID").orderBy("Category")
df.withColumn("row", row_number.over(w))
.filter($"row" === 1)
.orderBy("Product ID")
.drop("row")
.show
或使用groupBy
和 self-join 如
df.join(df.groupBy("Product ID").agg(first("Category").as("Category")), Seq("Product ID", "Category")).show
那些會給你結果的地方:
+----------+--------+-------+
|Product ID|Category| Status|
+----------+--------+-------+
| 1| Cat1|status1|
| 2| Cat1|status1|
| 3| Cat2|status1|
+----------+--------+-------+
考慮到您的類別是cat1., cat2., ... cat10., ...cat100.,....
您必須從類別中獲取數字,然后相應地對它們進行排序。
SELECT * FROM
(
SELECT
T.*,
ROW_NUMBER() OVER(
PARTITION BY PRODUCTID
ORDER BY TO_NUMBER(REGEXP_SUBSTR(CATEGORY, '[0-9]+'))
) AS RN
FROM YOUR_TABLE T
)
WHERE RN = 1;
干杯!!
我在 Yogesh 和 Lamansa 的回答的幫助下開發了以下解決方案
val df1 = df.withColum("row_num", when($"category"==="Cat1", "A"),
.when($"category" ==== "Cat2", "B"),
.when($"category" === "Cat3", "C"))
df1.join(df1.groupBy("product_id).agg(first("category").as("category")),
Seq("product_id","category")).show
何時用作按類別排序無法確保您的偏好按所需順序排列。 例如,Cat2 可以是首選。
Output :
+----------+--------+-------+
|Product ID|Category| Status|
+----------+--------+-------+
| 1| Cat1|status1|
| 2| Cat1|status1|
| 3| Cat2|status1|
+----------+--------+-------+
輸出 :
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.