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

一、问题描述

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

sql 复制代码
SELECT name,info
FROM
  (
   SELECT name,
   	      split(info_list,',') as info_arrary
   FROM 
     (
      select '张三' as name,'1,2,3' as info_list
      union all
      select '李四' 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('','')构造出一个['']数组,改写后的语句如下

sql 复制代码
SELECT name,info
FROM
  (
   SELECT name,
          coalesce(split(info_list,','),split('','')) as info_arrary
   FROM 
     (
      select '张三' as name,'1,2,3' as info_list
      union all
      select '李四' 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,改写后的语句如下:

sql 复制代码
SELECT name,info
FROM
  (
   SELECT name,
          split(info_list,',') as info_arrary
   FROM 
     (
      select '张三' as name,'1,2,3' as info_list
      union all
      select '李四' 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.

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

相关推荐
无级程序员3 小时前
hive2服务启动报错:/tmp/hive on HDFS should be writable(不是chmod 777能解决的)
hive·hadoop·hdfs
rui锐rui5 小时前
大数据学习2:HIve
大数据·hive·学习
凌辰揽月9 小时前
Servlet学习
hive·学习·servlet
weixin_3077791319 小时前
Hive集群之间迁移的Linux Shell脚本
大数据·linux·hive·bash·迁移学习
王小王-1231 天前
基于Hadoop的公共自行车数据分布式存储和计算平台的设计与实现
大数据·hive·hadoop·分布式·hadoop公共自行车·共享单车大数据分析·hadoop共享单车
王小王-1231 天前
基于Hadoop的大规模文本词频统计分析系统设计与实现
hadoop·mapreduce·hadoop词频统计·hadoop文本统计·mapreduce词频统计
陈敬雷-充电了么-CEO兼CTO1 天前
推荐算法系统系列>推荐数据仓库集市的ETL数据处理
大数据·数据库·数据仓库·数据挖掘·数据分析·etl·推荐算法
桂成林1 天前
Hive UDF 开发实战:MD5 哈希函数实现
hive·hadoop·哈希算法
isNotNullX1 天前
什么是数据分析?常见方法全解析
大数据·数据库·数据仓库·人工智能·数据分析
王小王-1232 天前
基于Hadoop的京东厨具商品数据分析及商品价格预测系统的设计与实现
hadoop·数据分析·京东厨具·厨具分析·商品分析