Hive侧视图 Lateral View(单个、多个、outer)(附案例)

本文介绍了如何利用LateralView和UDTF在Hive中高效地操作表数据,通过连接、拆分和外连接操作,实现灵活的数据处理和分析。通过示例展示了单个、多个LateralView的使用,以及OuterLateralView在空结果处理上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lateral View 和UDTF类功能函数一起使用,表中的每一行和UDTF函数输出的每一行进行连接,生成一张新的虚拟表,可以对UDTF产生的记录设置字段名称,新加的字段可以使用在 sort by,group by 等语句中,不需要再套一层子查询。Lateral View 的作用是可以扩展原来的表数据。

Lateral View Syntax:

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

案例数据准备:

--创建表
create table lateral_test(
  name string,
  course string,
  hobby string
)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
 
--样例数据
[root@wadeyu ~]# cat lateral_test.log 
wadeyu  c1,c2,c3    basketball,tennis
tom c2,c3,c5    swimming,trip
polly   c1,c2,c3    sz
 
--查询数据
0: jdbc:hive2://> select * from lateral_test;
OK
+--------------------+----------------------+---------------------+--+
| lateral_test.name  | lateral_test.course  | lateral_test.hobby  |
+--------------------+----------------------+---------------------+--+
| wadeyu             | c1,c2,c3             | basketball,tennis   |
| tom                | c2,c3,c5             | swimming,trip       |
| polly              | c1,c2,c3             | sz                  |
+--------------------+----------------------+---------------------+--+
3 rows selected (0.511 seconds)

示例一:单个 Lateral View

select 
  name, 
  course, 
  t_hobby.hobby 
from lateral_test 
lateral view explode(split(hobby, ',')) t_hobby as hobby;
 
OK
+---------+-----------+----------------+--+
|  name   |  course   | t_hobby.hobby  |
+---------+-----------+----------------+--+
| wadeyu  | c1,c2,c3  | basketball     |
| wadeyu  | c1,c2,c3  | tennis         |
| tom     | c2,c3,c5  | swimming       |
| tom     | c2,c3,c5  | trip           |
| polly   | c1,c2,c3  | sz             |
+---------+-----------+----------------+--+
5 rows selected (0.535 seconds)

示例二:多个 Lateral View

  • Lateral View左边的字段都可以使用
select 
  name, 
  t_course.course, 
  t_hobby.hobby 
from lateral_test 
lateral view explode(split(course, ',')) t_course as course 
lateral view explode(split(hobby, ',')) t_hobby as hobby;
 
+---------+------------------+----------------+--+
|  name   | t_course.course  | t_hobby.hobby  |
+---------+------------------+----------------+--+
| wadeyu  | c1               | basketball     |
| wadeyu  | c1               | tennis         |
| wadeyu  | c2               | basketball     |
| wadeyu  | c2               | tennis         |
| wadeyu  | c3               | basketball     |
| wadeyu  | c3               | tennis         |
| tom     | c2               | swimming       |
| tom     | c2               | trip           |
| tom     | c3               | swimming       |
| tom     | c3               | trip           |
| tom     | c5               | swimming       |
| tom     | c5               | trip           |
| polly   | c1               | sz             |
| polly   | c2               | sz             |
| polly   | c3               | sz             |
+---------+------------------+----------------+--+
15 rows selected (0.521 seconds)

示例三:Outer Lateral View

  • UDTF未产生行时,连接结果为空,如果想输入的行也输出,需要加上Outer关键字
# 未加Outer关键字,输出内容为空
select 
  name,
  course,
  col1
from lateral_test
lateral view explode(array()) et as col1;
 
+-------+---------+-------+--+
| name  | course  | col1  |
+-------+---------+-------+--+
+-------+---------+-------+--+
No rows selected (0.499 seconds)
 
# 加上Outer关键字,输出不为空
select 
  name,
  course,
  col1
from lateral_test
lateral view outer explode(array()) et as col1;
 
+---------+-----------+-------+--+
|  name   |  course   | col1  |
+---------+-----------+-------+--+
| wadeyu  | c1,c2,c3  | NULL  |
| tom     | c2,c3,c5  | NULL  |
| polly   | c1,c2,c3  | NULL  |
+---------+-----------+-------+--+
3 rows selected (0.543 seconds)

### Navicat 导入 MySQL 文件失败的原因分析与解决方案 #### 1. 数据库连接配置错误 如果数据库连接设置不正确,可能导致无法成功导入数据。确保主机名、端口、用户名和密码都已正确填写[^1]。 #### 2. SQL语法兼容性问题 不同版本之间的SQL语句可能存在差异,某些特定于旧版MySQL的功能可能不再被支持。建议先通过命令行工具测试单条INSERT语句能否正常执行来排查此类问题[^2]。 #### 3. 字符集编码冲突 字符集设定不当会引发乱码现象或是直接阻止文件加载过程中的解析工作。检查源文件以及目标表结构定义里所使用的charset属性是否一致;必要时可尝试转换成通用格式如UTF8mb4再重试操作[^3]。 #### 4. 权限不足 用户账户权限不够充分也会造成访问受限从而影响到整个流程顺利完成。确认当前登录身份具备足够的权利去创建新对象(表)、修改现有架构乃至向指定位置写入记录等行为[^4]。 #### 5. 超大事务提交超时 当一次性处理大量数据时,默认的最大允许时间可能会过短而触发中断机制。适当调整`max_allowed_packet`参数值可以有效缓解这一状况的发生概率[^5]。 ```sql SET GLOBAL max_allowed_packet=67108864; -- 设置为64M, 单位字节 ``` 对于上述提到的各项因素,在实际解决问题之前应该逐一验证并排除干扰项,最终找到最合适的办法使Navicat能够顺利地完成对MySQL文件的数据迁移任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值