[英]Split a row into multiple rows based on a column value
我試圖將表中的記錄拆分為基於列值的2條記錄。 輸入表顯示3種類型的產品及其價格。 對於特定產品(行),只有其對應的列具有值。 其他列有Null。
我的要求是 - 只要產品列值(連續)是復合的(即有多個產品,例如Bolt + Brush),記錄必須分成兩行 - 復合產品類型各一行。
所以,在這個例子中,注意第二行(在輸入中)如何分成2行 - > 1行用於“Bolt”而另一行用於“Brush”,其價格從相應的列中提取(即在這種情況下) ,“Bolt”= 3.99美元,“刷子”= 6.99美元)
注意:對於復合產品值,最多可以有2個產品,如本例所示(例如Bolt + Brush)
CustId | Product | Hammer | Bolt | Brush
--------------------------------
12345 | Hammer | $5.99 | Null | Null
53762 | **Bolt+Brush** | Null | $3.99 | $4.99
43883 | Brush | Null | Null | $4.99
我嘗試使用CTE通過UNION ALL創建2個預定記錄,然后使用CTE創建main_table左外連接,以便連接產生2個記錄。
#CustId | Product | Price #
12345 | Hammer | $5.99
**53762** | **Bolt** | $3.99
**53762** | **Brush** | $4.99
43883 | Brush | $4.99
這必須僅通過Spark-SQL解決。
我認為這會奏效:
select CustId, 'Hammer' as product, Hammer
from t
where Product like '%Hammer%'
union all
select CustId, 'Bolt' as product, Bolt
from t
where Product like '%Bolt%'
union all
select CustId, 'Brush' as product, Brush
from t
where Product like '%Brush%';
這也可以
select custid, product,
case when product like '%Hammer%' then hammer
when product like '%Bolt%' then bolt
else brush end as Price from
(select custid, explode(split(product,'\\+')) as product, hammer, bolt, brush
from t) x;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.