在 HIVE 中转置数据
Posted
技术标签:
【中文标题】在 HIVE 中转置数据【英文标题】:Transpose data in HIVE 【发布时间】:2021-09-22 12:02:38 【问题描述】:我在 Hive 中有以下数据集,我想将行转置为列。
Customer | Status | Quantity |
---|---|---|
25 | Paid | 5 |
25 | N Paid | 2 |
67 | Open | 12 |
67 | Paid | 4 |
45 | N Paid | 3 |
45 | Open | 2 |
我想在转置后有一个新表,其中仅显示客户一行,状态多列,例如
Customer | Paid | N Paid | Open |
---|---|---|---|
25 | 5 | 2 | 0 |
67 | 4 | 0 | 12 |
45 | 0 | 3 | 2 |
我尝试了一些在 Internet 上找到的示例,但无法使其正常工作。在这里,为了简单起见,我只列出了三种状态,但实际上我可以有更多。
在 SAS 中,我曾经做过以下事情:
proc transpose
data = imputtable;
out = outputtable;
by customer;
id status;
var quantity;
run;
SAS 获取所有现有状态并将它们转换为列。我希望在 Hive 中做同样的事情。
问候,
马西奥
【问题讨论】:
【参考方案1】:使用条件聚合:
select Customer,
sum(case when Status = 'Paid' then Quantity else 0 end) as Paid ,
sum(case when Status = 'N Paid' then Quantity else 0 end) as `N Paid` ,
sum(case when Status = 'Open' then Quantity else 0 end) as Open
from table
group by Customer
【讨论】:
有没有什么方法可以在不在 CASE 子句中提及的情况下获得所有状态?作为 SAS 示例,我添加了。 @MarcioLino 在 Hive 中不可能,它不支持动态 SQL。以上是关于在 HIVE 中转置数据的主要内容,如果未能解决你的问题,请参考以下文章