我正在尝试根据列值将表中的记录分为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解决。
答案 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;