当前位置: 首页 > news >正文

Hive Lateral View explode列为空时导致数据异常丢失

一、问题描述

日常工作中我们经常会遇到一些非结构化数据,因此常常会将Lateral View 结合explode使用,达到将非结构化数据转化成结构化数据的目的,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失。
在这里插入图片描述

SELECT name,info
FROM(SELECT name,split(info_list,',') as info_arraryFROM (select '张三' as name,'1,2,3' as info_listunion allselect '李四' as name,null as info_list) t1     -- 构造测试数据) t2
LATERAL VIEW explode(t2.info_arrary) a as info ;

查询结果:
在这里插入图片描述

查看结果我们可以发现 ‘李四’ 这条数据数据丢了,这就会造成我们最终统计的数据出现错误。

二、查找原因

通过定位我们可以发现 ‘李四’ 这一行的info字段为null,其split之后的结果自然也是为null,通过LATERAL VIEW explode之后会形成一个为null的view,这样无法关联出数据,该数据就会丢失。

三、解决办法(建议使用方法二)

3.1 方法一

对子查询中的split结果强制使用coalesce()方法,将null替换成一个为[’’]的数组,直接这么写会误以为string字符串。我们可以使用split(’’,’’)构造出一个[’’]数组,改写后的语句如下

SELECT name,info
FROM(SELECT name,coalesce(split(info_list,','),split('','')) as info_arraryFROM (select '张三' as name,'1,2,3' as info_listunion allselect '李四' as name,null as info_list) t1     -- 构造测试数据) t2
LATERAL VIEW OUTER explode(t2.info_arrary) a as info ;

在这里插入图片描述
请注意 ‘李四’ 的结果为空字符,不是null。

3.2 方法二

使用官方提供的LATERAL VIEW OUTER来进行解决,该方法类似于left outer join,即如果explode出来的结果为null,也会保留记录,只不过对应字段为null,改写后的语句如下:

SELECT name,info
FROM(SELECT name,split(info_list,',') as info_arraryFROM (select '张三' as name,'1,2,3' as info_listunion allselect '李四' as name,null as info_list) t1     -- 构造测试数据) t2
LATERAL VIEW OUTER explode(t2.info_arrary) a as info ;

查询结果:
在这里插入图片描述

请注意 ‘李四’ 的结果为null,而不是空字符。

以下是官方文档关于该用法的解释:

The user can specify the optional OUTER keyword to generate rows even when a LATERAL VIEW usually would not generate a row. This happens when the UDTF used does not generate any rows which happens easily with explode when the column to explode is empty. In this case the source row would never appear in the results. OUTER can be used to prevent that and rows will be generated with NULL values in the columns coming from the UDTF.

为了保持代码的稳定性与数据的准确性,建议使用第二种方法。

http://www.lryc.cn/news/233702.html

相关文章:

  • 音频类型转换工具-可执行文件exe/dmg制作
  • 【Proteus仿真】【51单片机】公交车报站系统
  • C++--STL总结
  • Python----图像的手绘效果
  • Android13集成paho.mqtt.android启动异常
  • STM框架之按键扫描新思路
  • Linux服务器挂载另一台服务器的文件夹(mount)
  • 剑指offer --- 用两个栈实现队列的先进先出特性
  • 流媒体协议
  • ClickHouse的分片和副本
  • C语言编程陷阱(五)
  • chardet检测文件编码,使用生成器逐行读取文件
  • html所有标签和DOCTYPE的总结
  • 2023年11月15号期中测验判断题(Java)
  • 基于 selenium 实现网站图片采集
  • vue3相关内容
  • AWTK实现汽车仪表Cluster/DashBoard嵌入式GUI开发(七):FreeRTOS移植
  • 《洛谷深入浅出进阶篇》P1995 程序自动分析——并查集,离散化
  • 基于单片机的自动循迹小车(论文+源码)
  • linux系统中安装python到指定目录
  • 分布式事务 - seata安装
  • CentOS to 浪潮信息 KeyarchOS 迁移体验与优化建议
  • Go解析soap数据和修改其中数据
  • LeetCode98. Validate Binary Search Tree
  • 【LeetCode】206. 反转链表
  • 飞天使-通过GET 和POST进案例演示
  • 【MySql】12- 实践篇(十)
  • <C++> 反向迭代器
  • 【EI会议征稿】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)
  • 格力报案称“高管遭自媒体侮辱诽谤”