有没有一种方法可以在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岁!:)谢谢你的回答。我会测试一下,几天后告诉你。现在,我用一张地图和多个侧视图把它画到一半。我来试试这个。非常感谢!:)