有没有一种方法可以在Hive中转置数据?
蜂巢中的数据可以转置吗?如中所示,行变为列,列是行吗?如果没有直接的功能,有没有一种方法可以分两步完成 我有一张这样的桌子:有没有一种方法可以在Hive中转置数据?,hive,bigdata,transpose,Hive,Bigdata,Transpose,蜂巢中的数据可以转置吗?如中所示,行变为列,列是行吗?如果没有直接的功能,有没有一种方法可以分两步完成 我有一张这样的桌子: | ID | Names | Proc1 | Proc2 | Proc3 | | 1 | A1 | x | b | f | | 2 | B1 | y | c | g | | 3 | C1 | z
| ID | Names | Proc1 | Proc2 | Proc3 |
| 1 | A1 | x | b | f |
| 2 | B1 | y | c | g |
| 3 | C1 | z | d | h |
| 4 | D1 | a | e | i |
| A1 | B1 | C1 | D1 |
| x | y | z | a |
| b | c | d | e |
| f | g | h | i |
我希望它是这样的:
| ID | Names | Proc1 | Proc2 | Proc3 |
| 1 | A1 | x | b | f |
| 2 | B1 | y | c | g |
| 3 | C1 | z | d | h |
| 4 | D1 | a | e | i |
| A1 | B1 | C1 | D1 |
| x | y | z | a |
| b | c | d | e |
| f | g | h | i |
我一直在寻找其他相关的问题,他们都提到使用横向视图和分解,但是有没有一种方法可以选择性地选择横向视图和分解的列
另外,实现我想做的事情的粗略过程是什么?请帮帮我。谢谢
编辑:我一直在阅读此链接:它向我展示了我想要实现的目标的一半。链接中的第一个示例基本上是我想要的,只是我不希望行重复并希望它们作为列名。任何关于如何将数据转换成某种形式的想法,如果我进行
分解
,它将产生我想要的输出,或者以另一种方式,即先进行分解
,然后再进行另一个步骤,从而得到我想要的输出表。再次感谢 对不起,我不知道在蜂箱里有什么方法可以做到这一点。你接近爆炸等,但我不认为它可以完成工作
总的来说,从概念上讲,我认为在不事先知道目标表的列将是什么的情况下很难进行转置。这是正确的,特别是对于配置单元,因为元数据与数据库中的列数、列的类型、列的名称等相关——元存储。一般来说,这是正确的,因为事先不知道列,将需要某种内存中的数据保存(好的,当然有溢出),用户可能需要小心不要溢出内存等等(就像hive中的动态分区)
无论如何,长话短说,如果您事先知道目标表的列,生活是美好的。据我所知,hive本身没有set命令,但可以在select子句中使用一组if子句和case语句(我知道,但我过去也是这样做的)来转置数据。类似于
一定要让我知道进展如何 正如Mark所指出的,在Hive中没有简单的方法可以做到这一点,因为Hive中没有,而且您在尝试使用case/when“trick”时也可能会遇到问题,因为您有多个值(proc1、proc2、proc3) 出于测试目的,您可以尝试不同的方法:
select v, o1, o2, o3 from (
select k,
v,
LEAD(v,3) OVER() as o1,
LEAD(v,6) OVER() as o2,
LEAD(v,9) OVER() as o3
from (select transform(name,proc1,proc2,proc3) using 'python strm.py' AS (k, v)
from input_table) q1
) q2 where k = 'A1';
其中strm.py:
这里的技巧是在映射阶段使用python脚本,该脚本将行的每一列作为不同的行发出。然后每三分之一(因为我们有3个proc列)行将形成我们通过向前窥视(lead)得到的结果行
但是,此查询可以完成此任务,它有一个缺点,即随着输入的增加,您需要查看查询中的下一个第三个元素,这可能会导致性能下降。无论如何,您可以出于测试目的对其进行评估 谢谢马克的回答。是的,我有列名,事实上,整个表都是事先准备好的。我只想让它在不丢失关系/顺序的情况下将第2-61列转置到新表中。我肯定会研究
if
和case
语句。如果您还有其他想法,请务必告诉我。谢谢嘿,马克。。在你指给我的链接中,上面写着t.fieldname和t.fieldvalue。我们如何在配置单元中访问这些属性?有什么想法吗?谢谢我认为您无法访问它们,它们存储在metastore数据库中确实,罗兰是对的。我只是在查询中硬编码它们(即原始表的列名)。谢谢3只是为了说明目的。更像是60岁!:)谢谢你的回答。我会测试一下,几天后告诉你。现在,我用一张地图和多个侧视图把它画到一半。我来试试这个。非常感谢!:)