Hive中行拆分操作

0.背景

在使用Hive的时候有时候会遇到需要将一行“拆分”成多行的操作,如下。

原始数据格式,表名为student_table
class    student_array
1        [Tom,Jone]
2        [Lily,lucy]

目标数据格式
class   student_name
1       Tom
1       Jone
2       Lily
2       Lucy

1.做法

先上做法,如下:

SELECT class, student_name
FROM student_table LATERAL VIEW explode(student_array) tableAlias as student_name

2.解释

explode:首先我们知道UDF是user-defined function,例如concat(),都是输入一行输出一行。UDTF是 user-defined table-generating functions,相比较来说它们是输入一行输出多行,典型的就是explode()方法。https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF)

LATERAL VIEW:侧视表,用来连接UDTF(比如explode)产生的结果。如上所述,UTDF对每一行可以产生0行或者更多行,侧视表可以把这个结果join到原始表上,然后起一个别名。1中tableAlias即表别名。

基本语法
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*

3.进阶

MULtiple LATERAL

VIEW。多重侧视表,生成表的顺序和sql中写的顺序有关。在下例中,交换两行表中数据顺序是不一样的。


数据如下:
col1    col2
[1, 2]  [a", "b", "c"]

[3, 4]  [d", "e", "f"]

SELECT myCol1, myCol2 FROM baseTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;

OUTER参数

UDTF不同于UDF肯定有一行输出(哪怕是NULL),在有些情况下可能输出0行(典型的情况就是explode的列有空值),这样的话source row也不会再表中出现,有时候这并不是我们希望的,可以在sql中添加OUTER参数,相当于我们将原始表和explode的结果做OUTER JOIN,避免source row完全丢失的情况。

SELECT * FROM src LATERAL VIEW OUTER explode(array()) C AS a limit 10

4.参考

1.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

2.https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值