`
scholers
  • 浏览: 620303 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析

 
阅读更多
  由于HIVE中都是等值连接,在JOIN使用的时候,有两种写法在理论上是可以达到相同的效果的,但是由于实际情况的不一样,子表中数据的差异导致结果也不太一样。
 
写法一:

select
           a.bucket_id,
        a.search_type,
            a.level1,
        a.name1,
        a.level2,
        a.name2,
        cast((a.alipay_fee) as double) as zhuliu_alipay,
        cast(0 as double) as total_alipay
        from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
     left semi join
     tmall_data_fdi_dim_main_auc b
     on (a.level2 = b.cat_id2
         and a.brand_id = b.brand_id
       and b.cat_id2 > 0
         and b.brand_id > 0
         and b.max_price = 0
     )

3121 条
写法二:
select
           a.bucket_id,
        a.search_type,
            a.level1,
        a.name1,
        a.level2,
        a.name2,
        cast((a.alipay_fee) as double) as zhuliu_alipay,
        cast(0 as double) as total_alipay
        from tmall_data_fdi_search_zhuliu_alipay_cocerage_bucket_1 a
     join   tmall_data_fdi_dim_main_auc b
     on (a.level2 = b.cat_id2
         and a.brand_id = b.brand_id)
  where  b.cat_id2 > 0
         and b.brand_id > 0
         and b.max_price = 0


结果是:3142


这两种写法带来的值居然不是相等的,我一直以为理解这两种方式的写法是一样的,
但是统计的结果却是不一样的。
目前还没有搞清楚是什么原因,谁能那个搞清楚呢。


经过一层一层的查找,发现是由于子表(tmall_data_fdi_dim_main_auc)中存在重复的数据,当使用JOIN ON的时候,A,B表会关联出两条记录,应为ON上的条件符合;
而是用LEFT SEMI JOIN 当A表中的记录,在B表上产生符合条件之后就返回,不会再继续查找B表记录了,所以如果B表有重复,也不会产生重复的多条记录。

大多数情况下JOIN ON 和left semi on是对等的,但是在上述情况下会出现重复记录。大家以后可要小心。
2
0
分享到:
评论
4 楼 dacoolbaby 2013-04-27  
这个写法有问题。。。过滤数据要在结果集里面进行。。
3 楼 michaellou 2012-11-01  
tb现在真的是全民玩数据啊,哈哈
2 楼 scholers 2012-11-01  
michaellou 写道
tmall_data_fdi_dim_main_auc

tmall?? 天猫?

呵呵
1 楼 michaellou 2012-11-01  
tmall_data_fdi_dim_main_auc

tmall?? 天猫?

相关推荐

    Hive查询sql left join exists

    总的来说,理解和熟练运用LEFT JOIN、LEFT SEMI JOIN以及EXISTS子句是Hive SQL查询中的关键技能,它们在大数据分析中扮演着重要角色,帮助用户从海量数据中提取有价值的信息。根据实际需求选择合适的连接类型,能够...

    部分普通sql查询在hive中的实现方式

    - **背景**:Hive不支持标准SQL中的`IN`和`EXISTS`关键字,但可以通过`LEFT SEMI JOIN`来模拟这些功能。 - **示例**:标准SQL中的`IN`关键字查询如下: ```sql SELECT a.key, a.value FROM a WHERE a.key IN ...

    Hive基本命令整理

    Hive基本命令整理 作为大数据处理的重要工具,Hive 提供了许多实用的命令来帮助开发人员高效地处理和分析数据。...hive> SELECT * FROM things LEFT SEMI JOIN sales ON (things.id = sales.id); ```

    hive优化(ppt)

    在Hive中,通过使用`LEFT SEMI JOIN`而非`LEFT OUTER JOIN`,可以在不包含NULL值的情况下快速找到匹配项,从而减少数据传输和处理的时间,特别是在处理大规模数据集时效果显著。 ### 存储格式和压缩 存储格式和...

    Hive教程.pdf

    - Hive支持内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(FULL OUTER JOIN),但在某些情况下可能需要特殊处理以避免数据倾斜。 - **Inner Join**: - `SELECT t1.*, t2.* FROM ...

    hive练习数据和练习题及答案

    hive练习数据和hive练习题包含了hive练习数据,hive数据的建表ddl和hive练习题,非常适合做hive练习,新手培训,快速...LEFT SEMI JOIN Hive当前没有实现 IN/EXISTS 子查询,可以用 LEFT SEMI JOIN 重写子查询语句。

    Hive基本操作命令大全

    * in 查询:`SELECT * FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);` * Map 连接:`SELECT /*+ MAPJOIN(things) */ sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);` 其他...

    hive操作实战

    使用Hive的好处在于它提供了类似SQL的查询语言“HiveQL”,使得不熟悉MapReduce的用户也能轻松进行数据查询与分析工作。 #### 二、实战案例分析 ##### 2.1 创建表 在Hive中,创建表是非常基本且重要的操作之一。...

    HIVE-SQL开发规范.docx

    - 选择合适的JOIN类型,如LEFT SEMI JOIN比INNER JOIN更高效。 - 使用CBO(Cost-Based Optimizer)进行成本估算,自动选择最优执行路径。 2.6 安全性 遵循企业安全策略,使用Hive权限控制,限制用户对数据的访问。 ...

    hive 简明教程

    - Join操作:包括`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`、`FULL JOIN`以及`LEFT SEMI-JOIN`。 Hive还提供了排序操作,支持`ORDER BY`、`SORT BY`、`DISTRIBUTE BY`和`CLUSTER BY`等排序方式,以适应不同的业务...

    Apache Hive面试题

    5. **左半关联(LEFT SEMI JOIN)**: - **功能**:返回左侧表中出现在右侧表中的记录。 6. **笛卡尔积关联(CROSS JOIN)**: - **功能**:返回两个表的笛卡尔积结果。 #### 六、Hive SQL解析为MR Job的过程 1...

    SparkSQL相关语句总结.docx

    ` 这样的语句,但是可以使用 Left Semi Join 语句来解决这个问题,例如 `select * from src aa left semi join test bb on aa.key=bb.key;`。 6. 数据导入方式 SparkSQL 支持四种数据导入方式: * 从本地文件系统...

    罗炳森-SQL等价改写核心思想

    半连接(SEMI JOIN)是另一种关键的SQL操作,它仅返回主表中与子表有匹配关系的数据。常见的半连接形式包括使用IN或EXISTS子查询。例如,查询部门(dept)中存在员工(emp)的部门信息,可以使用两种方式表达:IN子...

    SQL等价改写核心思想概述.pptx

    - 反连接与半连接相反,它返回主表中不存在于子表关联的数据。在`NOT IN`,`NOT EXISTS`操作中常见。反连接的优化通常也涉及到转换为其他类型的连接或子查询。 4. **标量子查询**: - 标量子查询在查询中作为单个...

Global site tag (gtag.js) - Google Analytics