hive查询where join_hive NULL 以及在join连接时 ''和NULL连接查询结果

hive NULL生成方式:

1 文本方式:

如果通过 load data local inpath  '/opt/stu.txt' into table stu 这种上传本地文件数据方式到Hive制造hive NULL的时候,需要在 stu.txt中 用

id      name

1      zhangsan

2      \N

写法,而不是

id      name

1      zhangsan

2      null     ----> 这样入hive后的数据是字符串 null

2 数据库导入方式:

如果通过关系库sqoop导入到hdfs后通过hive外表关联方式:

类型

关系型数据库

hive

string

null

\N

string

""

""

int等其余类型

null

\N

对应hive string类型查询:

如果为 \N 使用is null查询 eg: where b.name is null;

如果为 “”  使用=''查询       eg: where b.name ='';

hive中 '' 和 NULL 在表关联下 是否会产生多余数据:

先以mysql为例讲解:

insert into stu(id,name) values('1','zm1');

insert into stu(id) values('2');

insert into stu(id) values('3');

insert into stu1(id,name,age) values('4','zm1','31');

insert into stu1(id,age) values('5','32');

insert into stu1(id,age) values('6','33');

select a.*, b.* from stu a join stu1 b on a.name = b.name;

mysql> select * from stu;

+------+------+

| id | name |

+------+------+

| 1 | zm1 |

| 2 | NULL |

| 3 | NULL |

+------+------+

mysql> select * from stu1;

+------+------+------+

| id | name | age |

+------+------+------+

| 4 | zm1 | 31 |

| 5 | NULL | 32 |

| 6 | NULL | 33 |

+------+------+------+

mysql> select a.*, b.* from stu a join stu1 b on a.name = b.name;

+------+------+------+------+------+

| id | name | id | name | age |

+------+------+------+------+------+

| 1 | zm1 | 4 | zm1 | 31 |

+------+------+------+------+------+

!!!!!!!!!!!!!mysql会进行优化 将on中name为null的去掉!!!!!!!!!!!!

将上述stu stu1数据做修改, update stu set name='' where id = '2' 都修改后展示时mysql为如下样子:

mysql> select * from stu;

+------+------+

| id | name |

+------+------+

| 1 | zm1 |

| 2 | |

| 3 | |

+------+------+

3 rows in set (0.00 sec)

mysql> select * from stu1;

+------+------+------+

| id | name | age |

+------+------+------+

| 4 | zm1 | 31 |

| 5 | | 32 |

| 6 | | 33 |

+------+------+------+

3 rows in set (0.00 sec)

mysql> select a.*, b.* from stu a join stu1 b on a.name = b.name;

+------+------+------+------+------+

| id | name | id | name | age |

+------+------+------+------+------+

| 1 | zm1 | 4 | zm1 | 31 |

| 2 | | 5 | | 32 |

| 3 | | 5 | | 32 |

| 2 | | 6 | | 33 |

| 3 | | 6 | | 33 |

+------+------+------+------+------+

5 rows in set (0.00 sec)

!!!!!!!!!!!!!mysql不会对''做优化 关联查询时候会被关联到!!!!!!!!!!!!

讲mysql ‘’ 和 NULL 是因为 经过试验操作 hive操作结果和 mysql操作结果一样,

即:

''下hive关联操作的字段会被作为关联条件,这样会产生很多垃圾数据,在ETL中数据做了预处理后,

建议查询条件增加非空串判断

eg: from stu a join tea b on a.name = b.name and a.name !='' and b.name != '' ;

NULL下hive关联操作的字段不会作为关联条件.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值