sql - Hive 中的多列爆炸

标签 sql arrays split hive hiveql

我正在尝试在 Hive 中分解多列中的记录。

例如,如果我的数据集如下所示 -

COL_01  COL_02     COL_03
1       A, B       X, Y, Z
2       D, E, F    V, W

我想要这个作为输出 -

COL_01  COL_02  COL_03
1       A        X
1       B        Y
1       NULL     Z
2       D        V
2       E        W
2       F        NULL

有没有办法在 Hive 中做到这一点?

我看到一些关于单列爆炸的帖子,但没有看到像本例这样的多列爆炸。

最佳答案

在子查询中单独分解并使用完全连接来连接它们。

with your_data as (
select stack(2,
1, 'A, B',     'X, Y, Z',
2, 'D, E, F',  'V, W'
) as (col_01, col_02, col_03)
) 

select nvl(s1.col_01,s2.col_01) as col_01, --do the same nvl() for all not exploded columns
       s1.col_02, s2.col_03
from
(select d.col_01, c2.pos2, c2.col_02 --explode col_02
  from your_data d
       lateral view outer posexplode(split(col_02,', ?')) c2 as pos2, col_02
)s1

full join

(select d.col_01, c3.pos3, c3.col_03 --explode col_03
  from your_data d
       lateral view outer posexplode(split(col_03,', ?')) c3 as pos3, col_03
)s2
on s1.col_01=s2.col_01 
   and s2.pos3=s1.pos2 --match position

结果:

col_01  s1.col_02   s2.col_03   
1          A           X    
1          B           Y    
1          NULL        Z    
2          D           V    
2          E           W    
2          F           NULL 

关于sql - Hive 中的多列爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56242737/

相关文章:

c++ - 从 C++ 文件中读取的奇怪数组

perl - 在 perl 中使用 split() 时如何实现我自己的转义序列?

php - 如何将大型 sql 文件导入 mysql 表

sql - 不允许从数据类型 datetime 到 int 的隐式转换嵌套存储过程

java - 如何从文件中将字符串读入字符串数组?

javascript - 如何使用 React 映射对象数组的对象数组

mysql - SQL 在 SELECT 之后一次更新多行

mysql - 如何在 MySQL 上获取类似查询的历史记录?

java - 获取冒号后的数据,分行显示

python - 我们如何将整列的内容拆分为同一个表中的单独列?