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

hive的join操作

阅读更多
Join的语法规则:
join_table:
    table_reference JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT|FULL} [OUTER]
    JOIN table_reference join_condition
  | table_reference LEFT SEMI JOIN
      table_reference join_condition

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [alias]
  | table_subquery alias
  | ( table_references )

join_condition:
    ON equality_expression ( AND equality_expression )*

equality_expression:
    expression = expression
Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。
Hive 不支持所有非等值的连接,因为非等值连接非常难转化到 map/reduce 任务。另外,Hive 支持多于 2 个表的连接。

join left/right outer join:一定输出左边/右边的每一行对应结果(其实都可以转换为做连接)
left semi join 用于实现a.key in select key from table b(即in/exist功能)

1. 只支持等值join,例如:

  SELECT a.* FROM a JOIN b ON (a.id = b.id)
  SELECT a.* FROM a JOIN b
    ON (a.id = b.id AND a.department = b.department)
是正确的,然而:
  SELECT a.* FROM a JOIN b ON (a.id  b.id)
是错误的。

2. 可以 join 多于 2 个表,例如

  SELECT a.val, b.val, c.val FROM a JOIN b
    ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
如果join中多个表的 join key 是同一个,则 join 会被转化为单个 map/reduce 任务,例如:
  SELECT a.val, b.val, c.val FROM a JOIN b
    ON (a.key = b.key1) JOIN c
    ON (c.key = b.key1)
被转化为单个 map/reduce 任务,因为 join 中只使用了 b.key1 作为 join key。

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1)
  JOIN c ON (c.key = b.key2)
而这一 join 被转化为 2 个 map/reduce 任务。因为 b.key1 用于第一次 join 条件,而 b.key2 用于第二次 join。

join 时,每次 map/reduce 任务的逻辑是这样的:reducer 会缓存 join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。
这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。
例如:

SELECT a.val, b.val, c.val FROM a
    JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)

所有表都使用同一个 join key(使用 1 次 map/reduce 任务计算)。Reduce 端会缓存 a 表和 b 表的记录,然后每次取得一个 c 表的记录就计算一次 join 结果,类似的还有:

  SELECT a.val, b.val, c.val FROM a
    JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

这里用了 2 次 map/reduce 任务。第一次缓存 a 表,用 b 表序列化;第二次缓存第一次 map/reduce 任务的结果,然后用 c 表序列化。

LEFT,RIGHT 和 FULL OUTER 关键字用于处理 join 中空记录的情况,例如:

  SELECT a.val, b.val FROM a LEFT OUTER
    JOIN b ON (a.key=b.key)

对应所有 a 表中的记录都有一条记录输出。当 a.key=b.key 时,输出的结果应该是 a.val, b.val;而当 b.key 中找不到等值的 a.key 记录时也会输出 a.val, NULL。
“FROM a LEFT OUTER JOIN b”这句一定要写在同一行——意思是 a 表在 b 表的左边,所以 a 表中的所有记录都被保留了;“a RIGHT OUTER JOIN b”会保留所有 b 表的记录。OUTER JOIN 语义应该是遵循标准 SQL spec的。

Join 发生在 WHERE 子句之前。
如果你想限制 join 的输出,应该在 WHERE 子句中写过滤条件——或是在 join 子句中写。这里面一个容易混淆的问题是表分区的情况:

  SELECT a.val, b.val FROM a
  LEFT OUTER JOIN b ON (a.key=b.key)
  WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'

会 join a 表到 b 表(OUTER JOIN),列出 a.val 和 b.val 的记录。WHERE 从句中可以使用其他列作为过滤条件。但是,如前所述,如果 b 表中找不到对应 a 表的记录,b 表的所有列都会列出 NULL,包括 ds 列。也就是说,join 会过滤 b 表中不能找到匹配 a 表 join key 的所有记录。这样的话,LEFT OUTER 就使得查询结果与 WHERE 子句无关了。解决的办法是在 OUTER JOIN 时使用以下语法:

  SELECT a.val, b.val FROM a LEFT OUTER JOIN b
  ON (a.key=b.key AND
      b.ds='2009-07-07' AND
      a.ds='2009-07-07')

这一查询的结果是预先在 join 阶段过滤过的,所以不会存在上述问题。这一逻辑也可以应用于 RIGHT 和 FULL 类型的 join 中。

Join 是不能交换位置的。无论是 LEFT 还是 RIGHT join,都是左连接的。

  SELECT a.val1, a.val2, b.val, c.val
  FROM a
  JOIN b ON (a.key = b.key)
  LEFT OUTER JOIN c ON (a.key = c.key)

先 join a 表到 b 表,丢弃掉所有 join key 中不匹配的记录,然后用这一中间结果和 c 表做 join。这一表述有一个不太明显的问题,就是当一个 key 在 a 表和 c 表都存在,但是 b 表中不存在的时候:整个记录在第一次 join,即 a JOIN b 的时候都被丢掉了(包括a.val1,a.val2和a.key),然后我们再和 c 表 join 的时候,如果 c.key 与 a.key 或 b.key 相等,就会得到这样的结果:NULL, NULL, NULL, c.val。

LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。
Hive 当前没有实现 IN/EXISTS 子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

  SELECT a.key, a.value
  FROM a
  WHERE a.key in
   (SELECT b.key
    FROM B);
可以被重写为:
   SELECT a.key, a.val
   FROM a LEFT SEMI JOIN b on (a.key = b.key)
分享到:
评论
1 楼 囧囧有神 2013-02-05  
嗯,

相关推荐

    Hive Summit 2011-join

    在Hive Summit 2011-join的内容中,可以看到Hive join操作策略的深入讨论,这包括每种join策略的使用场景、优势和潜在问题,帮助数据工程师更好地理解和使用Hive的join操作。此外,提到的join策略也为数据仓库和大...

    Hive-Summit-2011-join.zip_hive

    【标题】:“Hive-Summit-2011-join.zip_hive”指的是一个关于HiveJoin策略的讨论,源自2011年Facebook峰会上的分享。 【描述】:“Hive: Join Strategies. Facebook summit-2011”说明了这个主题集中在Hive的连接...

    hive sql + left join 数据缺失

    随着Hive版本的不断更新,部分用户在升级至Hive 3之后遇到了数据处理中的一个常见问题——在执行Left Join操作时出现数据缺失。 #### 二、问题复现 问题发生在如下的SQL语句中: ```sql SELECT a.* FROM ( SELECT ...

    Hive基本操作命令大全

    Hive基本操作命令大全 Hive是一个基于Hadoop的数据仓库工具,可以使用SQL语言来查询和管理大规模数据。本文档将详细介绍Hive的基本操作命令,从创建表、加载数据、查询数据到数据管理等方面进行整理。 创建表 ...

    13-Hive基本操作1

    桶是基于列值的哈希分区,有助于提高JOIN操作的效率。 实验内容不仅涵盖了上述的基本操作,还包括了对这些操作的实际应用,如创建和删除数据库,创建、修改和删除表,导入导出数据,以及管理表的分区和桶。通过这些...

    大数据实验六实验报告:熟悉Hive的基本操作

    Hive支持丰富的SQL查询语法,包括SELECT、WHERE、GROUP BY、JOIN等,允许用户对数据进行各种复杂分析。例如,可以查询某个交易所的所有股票的平均收盘价,或者根据日期和股票代码聚合分红总额。 通过这个实验,...

    Hive 基本命令操作1

    以上就是关于Hive基本命令操作的一些核心知识点,包括创建表、查看表结构、数据加载以及查询等。在实际操作中,根据业务需求选择合适的数据模型(如分区表)并正确地管理数据,能够极大地提高数据处理的效率和便利性...

    分布式数据仓库Hive大全

    1.6 其它HIVE操作 11 2. HIVE 基本操作 12 2.1 create table 12 2.1.1 总述 12 2.1.2 语法 12 2.1.3 基本例子 14 2.1.4 创建分区 15 2.1.5 其它例子 16 2.2 Alter Table 17 2.2.1 Add Partitions 17 2.2.2 Drop ...

    hive优化总结

    Hive优化总结是Hive性能优化的总结,涉及HIVE的参数设置、HQL语言的写法、JOIN操作的优化、MapReduce操作的优化、列裁剪、分区裁剪等多个方面。 1. 配置文件优化 Hive的配置文件hive-site.xml是Hive的核心配置文件...

    Hive元数据库操作

    Hive 元数据库操作 Hive 元数据库操作是 Hive 运维中常用的操作之一,它提供了对元数据的管理和查询功能。在 Hive 中,元数据是指对数据的描述信息,如表名、表路径、分区信息、列信息等。下面将对 Hive 元数据库...

    hive 操作相关的测试数据集

    这个测试数据集“hive操作相关的测试数据集hive”显然是为了帮助用户理解和实践Hive的各种操作,包括数据导入、查询、分析和数据导出等。 1. **Hive架构**:Hive的核心组件包括元数据存储、驱动器和编译器。元数据...

    Hive使用手册Hive使用手册

    本手册将深入探讨Hive的概念、数据类型、表的操作以及优化技巧。 1. **Hive概念与连接使用** Hive是建立在Hadoop之上的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,方便大数据...

    Hive优化方法整理

    1. 对于 join 操作,如果出现数据倾斜,应当设置 set hive.exec.reducers.max=200;set mapred.reduce.tasks= 200;以增大 Reduce 个数。 2. 对于 group by 操作,如果出现数据倾斜,应当设置 set hive.groupby....

    Hive总结.docx

    Hive支持大部分SQL标准,包括SELECT、FROM、WHERE、GROUP BY、JOIN等操作,使得用户可以方便地对Hadoop上的数据进行查询和分析。 【Hive函数】 Hive提供了丰富的内置函数,包括聚合函数(SUM、COUNT、AVG等)、数学...

    Hive操作笔记(呕心沥血制作)

    【Hive 操作笔记】 Hive 是一个基于 Hadoop 的数据仓库工具,它允许用户...在实际工作中,根据业务需求,还需要深入学习 Hive 的高级特性,如视图、JOIN 操作、UDF(用户定义函数)等,以实现更复杂的数据处理和分析。

    hive-2.1.0.rar

    Hive支持不同类型的JOIN操作,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,但需要注意的是,JOIN操作在大数据环境中可能非常耗时,因此合理设计表结构和使用分区可以优化JOIN性能。 7. **Hive与其它大数据...

    HIVE从入门到精通.pdf

    - **Join操作**:支持多种类型的JOIN操作,如INNER JOIN、LEFT JOIN等。 #### 十、Hive基本语法 - **常用语句**:包括SELECT、INSERT、UPDATE、DELETE等SQL-like语句。 #### 十一、Hive操作语句 - **DDL语句**:...

    Hive用户手册中文版.pdf

    对于Hive的Map/Reduce操作,Hive支持Map Join操作,这种操作适用于小表与大表进行join时的数据处理。同时,Hive支持Bucket和Sampling操作,以帮助用户更有效地处理数据。 Hive的设计目标是简化Hadoop上数据仓库的...

    hive

    它考虑了各种因素,如表大小、数据分布、JOIN 操作等,以生成最优的执行计划。 7. **数据生命周期管理**:Hive 提供了数据生命周期管理功能,可以设定数据的保留策略,自动清理过期的数据。 8. **与 BI 工具集成**...

    Hive用户指南 Hive user guide 中文版

    - **JOIN操作**:处理JOIN操作时需要考虑数据分布和大小。 - **DML操作**:Hive不支持标准的DML操作,如UPDATE和DELETE。 - **HAVING子句**:HAVING子句用于过滤聚合后的结果。 - **子查询**:子查询可以嵌套在其他...

Global site tag (gtag.js) - Google Analytics