簡體   English   中英

根據列值將行拆分為多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM