在处理流水增量表的时候,出现了一个判定的失误。

  1. select a.a1,a.a2
  2.   from
  3.     (
  4.     select
  5.       a.a1
  6.       ,if(a.a2<>b.b2,1,0) as diff
  7.      ,a.a2
  8.     from a
  9.     lefter join b
  10.     on a.a1=b.b1
  11.     ) c
  12. where c.diff=1;

因为左外关联,可能会出现b表数据不存在 则b.b2 is null , if(a.a2<>b.b2,1,0) as diff,null值的判断只能使用is ,is not

  1. 0: jdbc:hive2://localhost:10000/big12> select if(1 <>null,0,1);
  2. +------+--+
  3. | _c0 |
  4. +------+--+
  5. | 1 |
  6. +------+--+
  7. 1 row selected (0.13 seconds)
  8. 0: jdbc:hive2://localhost:10000/big12> select 1<>null;
  9. +-------+--+
  10. | _c0 |
  11. +-------+--+
  12. | NULL |
  13. +-------+--+
  14. 1 row selected (0.127 seconds)

所以处理方式:

  1. 0: jdbc:hive2://localhost:10000/big12> select if(1<>null or null is null,1,0) as diff;
  2. +-------+--+
  3. | diff |
  4. +-------+--+
  5. | 1 |
  6. +-------+--+
  7. 1 row selected (0.121 seconds)
  8. 0: jdbc:hive2://localhost:10000/big12> select if(1<>nvl(null,0),1,0) as diff;
  9. +-------+--+
  10. | diff |
  11. +-------+--+
  12. | 1 |
  13. +-------+--+
  14. 1 row selected (0.13 seconds)

其他:

employee表

  1. hive>desc employee;
  2. empid string
  3. deptid string
  4. salary string

查询employee

  1. hive>select * from employee
  2. 1 NULL NULL

hive 中null实际在HDFS中默认存储为'\N'(但是我们一般为了安全性把null的储存格式调整为'')
即employee中的数据在HDFS中为
1 \N \N
验证,插入'\N'

  1. hive>insert into table employee select '','\\N','\\N' from employee limit 1;

其中多一个斜杠是转义的作用
查询employee

  1. hive>select * from employee
  2. 1 NULL NULL
  3. 2 NULL NULL

此时hive中与null有关的函数,如nvl,coalesce,is null等判断是否为null是为true

  1. hive>select nvl(empid,'A'),nvl(deptid,'B'),nvl(salary,'C') from employee
  2. 1 B C
  3. 2 B C

但是null或NULL和''会被hive当做字符串处理。

  1. hive>insert into table employee select '','','' from employee limit 1;

查询:

  1. hive>select * from employee;
  2. 1 NULL NULL
  3. 2 NULL NULL
  4. 3
  1. hive>insert into table employee select '','null','NULL' from employee limit 1;

查询

  1. hive>select * from employee;
  2. 1 NULL NULL
  3. 2 NULL NULL
  4. 3
  5. 4 null NULL

注意:1,2同一行的NULL与4行的NULL或null不一样。4行的NULL或null为字符串
此时hive中与null有关的函数,如nvl,coalesce,is null等判断''和null(字符串)或NULL(字符串)是否为null是为false

  1. hive> select empid ,nvl(deptid,'E'),nvl(salary,'F') from employee;
  2. 1 E F
  3. 2 E F
  4. 3
  5. 4 null NULL
  1. hive>select * from employee where deptid='';
  2. 3
  3. hive>select * from employee where deptid='null' and salary ='NULL';
  4. 4 null NULL
  5. hive>select * from employee where deptid is null;
  6. 1 NULL NULL
  7. 2 NULL NULL

可以通过

  1. ALTER TABLE table_name SET SERDEPROPERTIES('serialization.null.format' = 定义描述符);

修改空值描述符
如果将''定义为NULL

  1. ALTER TABLE employee SET SERDEPROPERTIES('serialization.null.format' = '');

查询employee

  1. hive>select * from employee;
  2. 1 \N \N
  3. 2 \N \N
  4. 3 NULL NULL
  5. 4 null NULL

和前面的select比较发现''变成了NULL,而\N露出了真面目,4行的NULL或null为字符串没变化
验证,将''插入到emloyee

  1. hive> insert into table employee select '','','' from employee limit 1;

查询

  1. hive>select * from employee;
  2. 1 \N \N
  3. 2 \N \N
  4. 3 NULL NULL
  5. 4 null NULL
  6. 5 NULL NULL

注意:3,5同一行的NULL与4行的NULL或null不一样。4行的NULL或null为字符串
此时HDFS中如此存储

  1. 1 \N \N
  2. 2 \N \N
  3. 3
  4. 4 null NULL
  5. 5

此时

  1. hive> select empid ,nvl(deptid,'E'),nvl(salary,'F') from employee;
  2. 1 \N \N
  3. 2 \N \N
  4. 3 E F
  5. 4 null NULL
  6. 5 E F

总结hive中null的定义的意义在于:oracle数据导出后原表中的null会变成'',然后导入到hive中也变成了''。但是hive中关于NULL的一些函数如nvl,coalesce和is null却无法使用,因为hive默认\N才代表NULL。在hive中通过
ALTER TABLE SET SERDEPROPERTIES('serialization.null.format' = '');修改''代表NULL,改造存储过程中就不需要改nvl等语句。

hive中的null的更多相关文章

  1. hive中的NULL(hive空值处理)

    HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N, 这样造成浪费大量空间.而且用java.python直接进入 ...

  2. hive中的一种假NULL现象

    使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...

  3. Hive中的一种假NULL

    Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a       string Time taken ...

  4. hive中grouping sets的使用

    hive中grouping sets 数量较多时如何处理?    可以使用如下设置来 set hive.new.job.grouping.set.cardinality = 30; 这条设置的意义在于 ...

  5. Hive中自定义函数

    Hive的自定义的函数的步骤: 1°.自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF 2°.需要实现evaluate函数,evaluate函数支持重 ...

  6. hive中sql解析出对应表和字段的调查

    ---恢复内容开始--- .阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持. druid初期的版本中是包含hive的,将以前版本中的hive dialect对 ...

  7. HIVE中IN的坑

    问题:为什么HIVE中用了 NOT IN,结果集没了? 注:这个是原创,转载请注明,谢谢!直接进实验室>> > select * from a;OK1 a12 a23 a3Time ...

  8. hdfs数据到hive中,以及hdfs数据隐身理解

    hdfs数据到hive中: 假设hdfs中已存在好了数据,路径是hdfs:/localhost:9000/user/user_w/hive_g2park/user_center_enterprise_ ...

  9. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

随机推荐

  1. 十八:jinja2之include标签

    用于将页面的某一块地方抽取出来,要嵌入内容的时候使用,继承的概念 把具体内容分别放到其他地方同一管理,要用的时候使用include继承 使用include的时候可以直接使用接收的数据

  2. 简单的servlet上传文件

    boolean multipartContent = ServletFileUpload.isMultipartContent(request);if (multipartContent==true) ...

  3. 【SSM】---增删改查

    20:43:06 package com.chinasofti.dao; import java.util.List; import com.chinasofti.entity.User; publi ...

  4. beanFactory 设计模式 Bean 生命周期

    写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...

  5. Pycharm最新激活码汇总,pycharm2019激活码

    Pycharm激活码汇总 激活过程如下: 1.双击运行桌面上的Pycharm图标,进入下图界面,选择Do not import settings,之后选择OK,进入下一步. 2.拖动到底部,选择Acc ...

  6. kh67-wjs

    个人简历 基本信息 姓    名:                           性    别: 年    龄:                                籍    贯: 联 ...

  7. TCP端口扫描

    # TCP三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...

  8. 微信小程序开发(一)----- 基础知识

    1.什么是微信小程序 概念:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不需要关心是否安装太多应用的问题, ...

  9. 模板中用url_for的好处

    from flask import Flask,render_template app = Flask(__name__) @app.route('/') def index(): return re ...

  10. excel常用公式--逻辑运算类

    if:  IF(logical_test, value_if_true, [value_if_false]). and: 逻辑判断,相当于“并”. or: 逻辑判断,相当于“或”.