LEFT SEMI JOIN用法 附数据及代码可hive建表自己测试

LEFT SEMI JOIN用法 附数据及代码可hive建表自己测试

建hive表

本文使用的excel表格下载链接:
链接:https://pan.baidu.com/s/1HUzw3-vs3rXC80l_DVgmyQ
提取码:0f59
有更简单的建表方式,如建完空表之后使用insert into,我下面这样做主要为了记录下我工作中建表的四个步骤:
1.将csv文件拷贝到sublime中,另存为任何格式,保存完成后,再改成txt格式,如linshi.txt
2.将txt文件通过xftp拉到虚拟机中
3.在hive使用建表语句建空表

drop table if exists analyst.dividends;
CREATE TABLE IF NOT EXISTS analyst.dividends(   
jiaoyi             string          comment 'exchange交易',            
symbol             string          comment '标志',        
ymd                string          comment '年月日',        
dividend           float           comment '股息'
 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
drop table if exists analyst.stocks;
CREATE TABLE IF NOT EXISTS analyst.stocks(   
jiaoyi             string          comment 'exchange交易',            
symbol             string          comment '标志',        
ymd                string          comment '年月日',        
dividend           float           comment '股息',
price_open         float           comment 'none',
price_high         float           comment 'none',
price_low          float           comment 'none',
price_close        float           comment 'none',
volume             int             comment 'none',
price_adj_close    float           comment 'none'
 ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

4.通过xshell在空表中存入txt数据。

sh /abcde-hive.sh /data2/tmphdfs/fiona/linshi.txt   analyst.dividends

到目前为止
我们有2个表格

SELECT * from analyst.stocks

在这里插入图片描述

SELECT * from analyst.dividends

在这里插入图片描述

LEFT SEMI JOIN使用实例

现在试图返回限定的股息支付日内的股票交易记录
我们很容易想到SQL方言:

SELECT s.ymd, s.symbol, s.price_close FROM stocks s
WHERE s.ymd, s.symbol IN
(SELECT d.ymd, d.symbol FROM dividends d);

但是,hive不支持这种语法
幸好,我们可以使用如下的 LEFT SEMI-JOIN语法达到同样的目的:

SELECT s.ymd,
       s.symbol,
       s.price_close
FROM analyst.stocks s LEFT SEMI JOIN 
analyst.dividends d ON s.ymd = d.ymd
AND s.symbol = d.symbol;

结果:
**加粗样式**

总结

可见,
1.LEFT SEMI JOIN语句,大多数sql会通过in结构来处理。
2.LEFT SEMI JOIN语句,select 和 where 语句不能引用右表中的字段。
3.因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,join 会产生多条,也会导致 left semi join 的性能更高。 。
比如以下A表和B表进行 join 或 left semi join,然后 select 出所有字段,结果区别如下:
在这里插入图片描述
注意:蓝色叉的那一列实际是不存在left semi join中的,因为select 和 where 语句不能引用右表中的字段。

引用:

https://blog.csdn.net/HappyRocking/article/details/79885071
Programming Hive. Data Warehouse and Query Language for Hadoop by Edward Capriolo, Dean Wampler, Jason Rutherglen (z-lib.org)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值