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
首先引导到另一个步骤,然后引导到所需的输出表。再次感谢!
2条答案
按热度按时间0sgqnhkj1#
我不知道在Hive里有什么方法可以做这个,对不起。你接近爆炸等,但我不认为它可以完成工作。
总的来说,在概念上,我认为在不事先知道目标表的列将是什么的情况下很难进行转置。这是正确的,特别是对于配置单元,因为元数据与数据库中的列数、它们的类型、它们的名称等有关—元存储。一般来说,这是正确的,因为事先不知道列,需要某种内存中的数据(好的,当然有溢出),用户可能需要小心不要溢出内存之类的(就像hive中的动态分区一样)。
总之,长话短说,如果你事先知道目标表的列,生活是美好的。据我所知,hive本身没有set命令,但是您可以在select子句中使用一堆if子句和case语句(我知道很难看,但我过去也是这样做的)来转置数据。一些类似sql的东西-如何转置?
一定要告诉我进展如何!
ykejflvf2#
正如mark所指出的,在hive中没有简单的方法可以做到这一点,因为pivot在hive中不存在,而且您在尝试使用case/when“技巧”时也可能遇到问题,因为您有多个值(proc1、proc2、proc3)。
出于测试目的,您可以尝试不同的方法:
其中strm.py:
这里的技巧是在Map阶段使用python脚本,它将行的每一列作为不同的行发出。然后每三分之一(因为我们有3个proc列)行将形成一个结果行,我们通过向前看(lead)得到。
但是,这个查询可以完成这项工作,它有一个缺点,即随着输入的增长,您需要查看查询中的下一个第三个元素,这可能会导致性能下降。无论如何,你可以评估它的测试目的。