3

Hive 中的数据可以转置吗?如,行变成列,列是行?如果没有直接的功能,有没有办法通过几个步骤来完成?

我有一张这样的桌子:

 | 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  |

我一直在查找其他相关问题,他们都提到使用横向视图和分解,但是有没有办法选择性地为横向(ly)视图(ing)和分解(ing)选择列?

另外,实现我想做的事情的粗略过程可能是什么?请帮帮我。谢谢!

编辑:我一直在阅读这个链接:https ://cwiki.apache.org/Hive/languagemanual-lateralview.html它向我展示了我想要实现的一半。链接中的第一个示例基本上是我想要的,除了我不希望行重复并希望它们作为列名。关于如何将数据转换为表单的任何想法,如果我执行explode,它将导致我想要的输出,或者以其他方式,即explode首先导致另一个步骤,然后导致我想要的输出表。再次感谢!

4

2 回答 2

3

我不知道在蜂巢中开箱即用的方法来做到这一点,对不起。你接近爆炸等,但我不认为它可以完成工作。

总的来说,从概念上讲,我认为在不知道目标表的列将是什么的情况下很难进行转置。这是真的,尤其是对于 hive,因为元数据与数据库中的列数、它们的类型、它们的名称等有关 - 元存储。而且,这通常是正确的,因为事先不知道列,需要某种内存中的数据保存(好的,肯定有溢出),用户可能需要小心不要溢出内存等(就像动态蜂巢中的分区)。

无论如何,长话短说,如果您事先知道目标表的列,那么生活是美好的。据我所知,hive 本身没有 set 命令,但是您可以在select 子句转置数据。类似于 SQL 的东西 - 如何转置?

一定要告诉我进展如何!

于 2013-09-10T04:05:12.967 回答
1

正如 Mark 指出的那样,在 Hive 中没有简单的方法可以做到这一点,因为 Hive中不存在PIVOT ,并且您在尝试使用案例/当“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

import sys

for line in sys.stdin:
  line = line.strip()
  name, proc1, proc2, proc3 = line.split('\t')
  print '%s\t%s' % (name, proc1)
  print '%s\t%s' % (name, proc2)
  print '%s\t%s' % (name, proc3)

这里的技巧是在 map 阶段使用 python 脚本,它将一行的每一列作为不同的行发出。然后每三分之一(因为我们有 3 个 proc 列)行将形成我们通过向前窥视(领先)获得的结果行。

但是,这个查询可以完成这项工作,它的缺点是随着输入的增长,您需要查看查询中的下一个第三个元素,这可能会导致性能下降。无论如何,您可以出于测试目的对其进行评估。

于 2013-09-11T14:23:44.553 回答