大数据处理之魔幻的NULL

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据处理之魔幻的NULL

前言

null在数据中是一个很特殊的存在,我们实际经历多起生产事故,而且直接就带来直接的经济损失,这个值在实际使用的时候很容易被用错,今天我们来盘点一下null带来的坑吧。

对常见几种空的理解

比较结果错误

首先还是准备数据


create table tmp_null_test as select id,col from 
values(1,null)
,(2,'v2')
,(3,'v3')
,(null,'v4')
 t(id,col);

select * from tmp_null_test;

id  col
1 \N
2 v2
3 v3
\N  v4

最常见的就是我们期望获取null的值,比如我们很自然的想到列=null的情况

select * from tmp_null_test where col=null;

这个结果很诡异,实际上是查询不到结果的,我们直接看一下如果col=null是怎样的结果:

select id,col,col=null as pk from tmp_null_test;
id  col pk
1 \N  \N
2 v2  \N
3 v3  \N
\N  v4  \N

特别的神奇,pk结果清一色\N,这样告诉我们获取null这样子是会错误的,null和任何结果比较其实都是无意义的。

怎么办呢?一般有下面些办法:

1、使用 is null

select id,col,col is null as pk from tmp_null_test;
id  col pk
1 \N  true
2 v2  false
3 v3  false
\N  v4  false

2、使用 COALESCE/nvl函数把null转化掉,再进行过滤

select id,col,COALESCE(col,'')='' from tmp_null_test;
id  col _c2
1 \N  true
2 v2  false
3 v3  false
\N  v4  false

select id,col,nvl(col,'')='' from tmp_null_test;
id  col _c2
1 \N  true
2 v2  false
3 v3  false
\N  v4  false

大量null导致倾斜

null带来的倾斜主要有两种,一种是明确告诉你有null,再join我们倒是比较好发现,还一种是在隐式转换的时候带来了null这种很难发现,这个就是null阳谋和阴谋,不管那种情况,在数据体量比较大的时候,其实都会带来极差的性能。

阳谋

一般在数据内部有null的时候,我们直接用来做join,数据量大的时候就是很慢,甚至运行不出来,这种时候也是null的问题,这种情况需要看业务场景是否需要转化掉

阴谋

有一种情况存在,如下面图中的id,左边是字符串类型,右边其实是double类型,这种时候在做join的时候取值a,b的时候并不能转化成double,这个时候也会产生null

这种时候产生的null还不是直接产生的,是在做隐式转换的时候发生的,这个时候会导致异常,这种情况很难发现,我记得我们排查了大半年。后面发现问题之后,是需要提前把右边id转换成String类型,再做join。配上sql来说明:

第一次的样子:

select t1.id,t1.name,t2.name from  table1 t1 join table2  t2 on t1.id=t2.id

实际转换路径如下:

要注意的是这个操作是隐式的,可以在日志上面看到,但是一般人不感知,这种时候会造成null

解决办法:

select t1.id,t1.name,t2.name from  table1  join 
(selec cast(id as string) as id,name from  table2) t2 on t1.id=t2.id

这种方式是主动把原来是double类型的id主动转换成字符串,带来的是下面的效果:

null占空间极小,改变了分发策略

在orc格式的存储时代,大量null的数据存在在一个很小的空间中,通过测试发现一个2M的文件,可以存储2亿行的数据,这种时候2m引擎会认为你是小文件,从而直接进行广播,结构就是导致Driver端的OOM,这种时候出现了很多起事故。

怎么解决呢?发现了直接禁止掉了广播了

后记

null需要小心使用,否则~

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
SQL 分布式计算 运维
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
前面几篇文章详细介绍了sqoop全量增量导入数据到hive,大家可以看到我导入的数据如果有时间字段的话我都是在hive指定成了string类型,虽然这样可以处理掉时间字段在hive为空的问题,但是在kylin创建增量cube时需要指定一个时间字段来做增量,所以上面那种方式不行,这里的处理方式为把string改成timestamp类型,看实验:
【大数据开发运维解决方案】sqoop增量导入oracle/mysql数据到hive时时间字段为null处理
|
2月前
|
机器学习/深度学习 SQL 关系型数据库
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
52 0
|
2月前
|
SQL 关系型数据库 MySQL
总结 vue3 的一些知识点:MySQL NULL 值处理
总结 vue3 的一些知识点:MySQL NULL 值处理
|
2月前
|
SQL 关系型数据库 MySQL
MySQL NULL 值处理
MySQL NULL 值处理
|
2月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
66 2
|
6天前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
10 0
|
17天前
|
关系型数据库 MySQL
MySQL中如何处理NULL值以及如何使用正则表达式
MySQL中如何处理NULL值以及如何使用正则表达式
|
2月前
|
关系型数据库 MySQL 数据处理
实时计算 Flink版产品使用合集之如果在 MySQL 表中为某个字段设置了默认值,并且在插入数据时指定了该字段为 NULL,那么 MySQL 是否会使用默认值来填充这个字段
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
存储 关系型数据库 MySQL
Flink CDC中mysql cdc 抽取这个时间字段的值为null 有什么好的解决方案吗 ?
Flink CDC中mysql cdc 抽取这个时间字段的值为null 有什么好的解决方案吗 ?
148 0