在 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 中将列名转换为行的主要内容,如果未能解决你的问题,请参考以下文章

SQL将一些列名转换为行值,将一个列名行值转换为列名

SqlServer基本操作

如何在 Pig 中将字段转换为行?

如何在 hive 中将时间戳转换为 gmt 格式

在Oracle中将列转换为行[重复]

如何在sql server中将列转换为行