根据列值将一行拆分为多行

时间:2019-04-25 17:20:18

标签: sql apache-spark-sql

我正在尝试根据列值将表中的记录分为2条记录。输入表显示3种产品及其价格。对于特定产品(行),只有其相应的列才有价值。其他列为Null。

我的要求是-每当产品列值(连续)是复合的(即具有多个产品,例如Bolt + Brush)时,记录就必须分为两行-复合产品类型各为1行。

因此,在此示例中,请注意如何将第二行(输入中)分成两行->“螺栓”为第一行,“画笔”为另一行,其价格是从相应列中提取的(即在这种情况下,“螺栓” = $ 3.99,“刷子” = $ 6.99)

注意:如本例所示,对于复合产品值,最多可以有2种产品(例如,螺栓+刷子)

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 Left Outer Join,以便该联接产生2条记录。

#CustId   | Product   | Price  #
12345     | Hammer    | $5.99  
**53762** | **Bolt**  | $3.99  
**53762** | **Brush** | $4.99  
43883     | Brush     | $4.99  

这只能由Spark-SQL解决。

2 个答案:

答案 0 :(得分:0)

我认为这会起作用:

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%';

答案 1 :(得分:0)

这也可以

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;