有没有办法在Hive中转换数据?

o75abkj4  于 2021-07-13  发布在  Hive
关注(0)|答案(2)|浏览(447)

Hive中的数据能被转换吗?在中,行变成列,列就是行?如果没有直接的功能,有没有一种方法可以通过几个步骤来实现呢?
我有一张这样的table:

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

我一直在查其他相关的问题,他们都提到使用侧视图和分解,但是有没有一种方法可以有选择地选择侧视图和分解的列?
另外,要实现我想做的事情,有什么艰难的过程?请帮帮我。谢谢!
编辑:我一直在阅读以下链接:https://cwiki.apache.org/hive/languagemanual-lateralview.html 它向我展示了我想要实现的一半。链接中的第一个示例基本上是我想要的,只是我不希望行重复,希望它们作为列名。关于如何将数据转换成表格的任何想法,如果我 explode ,它会产生我想要的输出,或者相反, explode 首先引导到另一个步骤,然后引导到所需的输出表。再次感谢!

0sgqnhkj

0sgqnhkj1#

我不知道在Hive里有什么方法可以做这个,对不起。你接近爆炸等,但我不认为它可以完成工作。
总的来说,在概念上,我认为在不事先知道目标表的列将是什么的情况下很难进行转置。这是正确的,特别是对于配置单元,因为元数据与数据库中的列数、它们的类型、它们的名称等有关—元存储。一般来说,这是正确的,因为事先不知道列,需要某种内存中的数据(好的,当然有溢出),用户可能需要小心不要溢出内存之类的(就像hive中的动态分区一样)。
总之,长话短说,如果你事先知道目标表的列,生活是美好的。据我所知,hive本身没有set命令,但是您可以在select子句中使用一堆if子句和case语句(我知道很难看,但我过去也是这样做的)来转置数据。一些类似sql的东西-如何转置?
一定要告诉我进展如何!

ykejflvf

ykejflvf2#

正如mark所指出的,在hive中没有简单的方法可以做到这一点,因为pivot在hive中不存在,而且您在尝试使用case/when“技巧”时也可能遇到问题,因为您有多个值(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列)行将形成一个结果行,我们通过向前看(lead)得到。
但是,这个查询可以完成这项工作,它有一个缺点,即随着输入的增长,您需要查看查询中的下一个第三个元素,这可能会导致性能下降。无论如何,你可以评估它的测试目的。

相关问题