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

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

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

  1. | ID | Names | Proc1 | Proc2 | Proc3 |
  2. | 1 | A1 | x | b | f |
  3. | 2 | B1 | y | c | g |
  4. | 3 | C1 | z | d | h |
  5. | 4 | D1 | a | e | i |

我希望它是这样的:

  1. | A1 | B1 | C1 | D1 |
  2. | x | y | z | a |
  3. | b | c | d | e |
  4. | 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)。
出于测试目的,您可以尝试不同的方法:

  1. select v, o1, o2, o3 from (
  2. select k,
  3. v,
  4. LEAD(v,3) OVER() as o1,
  5. LEAD(v,6) OVER() as o2,
  6. LEAD(v,9) OVER() as o3
  7. from (select transform(name,proc1,proc2,proc3) using 'python strm.py' AS (k, v)
  8. from input_table) q1
  9. ) q2 where k = 'A1';

其中strm.py:

  1. import sys
  2. for line in sys.stdin:
  3. line = line.strip()
  4. name, proc1, proc2, proc3 = line.split('\t')
  5. print '%s\t%s' % (name, proc1)
  6. print '%s\t%s' % (name, proc2)
  7. print '%s\t%s' % (name, proc3)

这里的技巧是在Map阶段使用python脚本,它将行的每一列作为不同的行发出。然后每三分之一(因为我们有3个proc列)行将形成一个结果行,我们通过向前看(lead)得到。
但是,这个查询可以完成这项工作,它有一个缺点,即随着输入的增长,您需要查看查询中的下一个第三个元素,这可能会导致性能下降。无论如何,你可以评估它的测试目的。

展开查看全部

相关问题