如何将分号分隔的数据拆分为配置单元中的列并转置它?

Posted

技术标签:

【中文标题】如何将分号分隔的数据拆分为配置单元中的列并转置它?【英文标题】:How to split semicolon separated data to columns in hive and also transpose it? 【发布时间】:2015-06-29 11:28:06 【问题描述】:

我在 hive 表中有一个以下格式的数据集。

<br><b>|Col_1&nbsp;| Col_2&nbsp; &nbsp;|Col_3</b></<br>
<br>|abc_1&nbsp;|&nbsp;a;b;c;d&nbsp;&nbsp;|m;n</br>
<br>|abc_2  | e;f;d &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|l;h;p<br>

我需要将数据转换成以下格式。

<br><b>|Col_1&nbsp;|&nbsp;Col_2_OR_3&nbsp;|Value</b></<br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;a</br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;b</br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;c</br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;d</br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;m</br>
<br>|abc_1&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;n</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;e</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;f</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;d</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;l</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;h</br>
<br>|abc_2&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;Col_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;p</br>

数据最初在 Col_1 中的值是唯一的。Col_2Col_3 中的分号分隔值需要分开并转置为新列 Value 并且需要创建另一列 Col_2_OR_3,其中包含从 Col_2Col_2 中选择分号分隔值的列的列标题值strong> 或 Col_3

【问题讨论】:

【参考方案1】:
select col_1,'Col_2',col_2_al
from <table_name>
lateral view explode(split(col_2, "\\\;")) col_2_al as col_2_al 
union all
select col_1,'Col_3',col_2_al
from <table_name>
lateral view explode(split(col_3,"\\\;")) col_3_al as col_2_al

【讨论】:

以上是关于如何将分号分隔的数据拆分为配置单元中的列并转置它?的主要内容,如果未能解决你的问题,请参考以下文章

将逗号分隔值拆分为 Oracle 中的列

MySQL查询将分隔字符串值拆分为单独的列[重复]

将逗号分隔的列条目拆分为行

拆分由空白字符分隔的数字列。

将 pandas 中的一个单元格拆分为多行

postgres 9.4将多个分隔符上的列拆分为新列