我知道在Hive里没有直接的方法来转换数据。我问了一个问题:有没有办法在Hive中转换数据,但由于那里没有最终的答案,无法一路得到。
这是我的table:
| ID | Code | Proc1 | Proc2 |
| 1 | A | p | e |
| 2 | B | q | f |
| 3 | B | p | f |
| 3 | B | q | h |
| 3 | B | r | j |
| 3 | C | t | k |
这里proc1可以有任意数量的值。id、code和proc1一起构成此表的唯一键。我想透视/转置这个表,这样proc1中的每个惟一值都成为一个新列,proc2中的对应值就是该列中对应行的值。在essense,我试图得到这样的东西:
| ID | Code | p | q | r | t |
| 1 | A | e | | | |
| 2 | B | | f | | |
| 3 | B | f | h | j | |
| 3 | C | | | | k |
在新转换的表中,id和code是唯一的主键。从我上面提到的票,我可以得到这么远使用Mapudaf(免责声明-这可能不是朝着正确的方向迈出的一步,但如果是的话,请在此提及)
| ID | Code | Map_Aggregation |
| 1 | A | {p:e} |
| 2 | B | {q:f} |
| 3 | B | {p:f, q:h, r:j } |
| 3 | C | {t:k} |
但不知道如何从这一步到我想要的透视/转置表。任何帮助如何进行都太好了!谢谢。
9条答案
按热度按时间t1rydlwq1#
对于unpivot,我们可以简单地使用下面的逻辑。
2exbekwf2#
下面是我使用hive的内部udf函数“map”来解决这个问题的方法:
“concat\u ws”和“map”是配置单元自定义项,“collect\u list”是配置单元自定义项。
toiithl63#
您可以使用case语句和collect\u set的一些帮助来实现这一点。你可以看看这个。你可以在-http://www.analyticshut.com/big-data/hive/pivot-rows-to-columns-in-hive/
这里是查询参考,
ldxq2e6h4#
另一个解决方案。
使用hivemall透视
to_map
功能。SELECT t1.uid, t2.key, t2.value
FROM htable t1
LATERAL VIEW explode (map(
'c1', c1,
'c2', c2,
'c3', c3
)) t2 as key, value
```
uid key value 101 c1 11 101 c2 12 101 c3 13 102 c1 21 102 c2 22 102 c3 23
nkoocmlb5#
下面也是一个支点
qacovj5a6#
我还没有写这段代码,但我认为您可以使用klouts brickhouse提供的一些自定义项:https://github.com/klout/brickhouse
具体来说,您可以使用此处提到的collect:http://brickhouseconfessions.wordpress.com/2013/03/05/use-collect-to-avoid-the-self-join/
然后使用本文详述的方法分解数组(它们的长度不同)http://brickhouseconfessions.wordpress.com/2013/03/07/exploding-multiple-arrays-at-the-same-time-with-numeric_ra
pgky5nke7#
如果是数值,可以使用以下配置单元查询:
样本数据
332nm8kg8#
我使用下面的查询创建了一个名为hive的虚拟表-
create table hive (id Int,Code String, Proc1 String, Proc2 String);
已加载表中的所有数据-现在使用下面的查询来实现输出。
ni65a41a9#
以下是我最终使用的解决方案:
toïmap自定义项是从brickhouse回购中使用的:https://github.com/klout/brickhouse