在 Hive 中将列名转换为行
Posted
技术标签:
【中文标题】在 Hive 中将列名转换为行【英文标题】:Convert Column Names to Rows in Hive 【发布时间】:2019-03-05 08:02:54 【问题描述】:我在 Hive 有一张桌子。我必须将列名转换为行。我的表如下 -
+---------+---------+---------+
|Table 1 | Table 2 | Table 3 |
+---------+---------+---------+
| A | D | F |
+---------+---------+---------+
| B | E | |
+---------+---------+---------+
| C | | |
+---------+---------+---------+
我需要将其转换为具有 2 列的表格。第一列将具有标题 -> 表名,第一列中的值将是旧表的列名。最终输出应该是这样的 -
+-----------+--------+
|Table Name | Val |
+-----------+--------+
| Table 1 | A |
+-----------+--------+
| Table 1 | B |
+-----------+--------+
| Table 1 | C |
+-----------+--------+
| Table 2 | D |
+-----------+--------+
| Table 2 | E |
+-----------+--------+
| Table 3 | F |
+-----------+--------+
我被困住了。如何使用 Hive 获得所需的输出?
【问题讨论】:
【参考方案1】:使用UNION ALL
,为与您的列名对应的第一列提供静态值:
CREATE TABLE new_table as
select * from
(
select 'Table 1' as Table_Name, Table_1 as Val from your_table
UNION ALL
select 'Table 2' as Table_Name, Table_2 as Val from your_table
UNION ALL
select 'Table 3' as Table_Name, Table_3 as Val from your_table
) s where Val is not NULL
;
【讨论】:
嗨!感谢您的回复。但在这种情况下,我们将不得不对列名和值进行硬编码。如果值的数量太多怎么办?有没有一种方法可以导出这些值而不是硬编码它们? 不幸的是,Hive 本身不支持动态 SQL。您可以尝试使用 shell 从 DESCRIBE 命令输出中生成此 SQL 提取列以上是关于在 Hive 中将列名转换为行的主要内容,如果未能解决你的问题,请参考以下文章