【问题标题】:Is it bad to do joins in Hive?在 Hive 中加入是不是很糟糕?
【发布时间】:2018-01-20 03:24:01
【问题描述】:

您好,我最近加入了一项使用 Hive 和 PostgreSQL 的新工作。现有的 ETL 脚本从 Hive 按日期分区收集数据并在 PostgreSQL 中为这些数据创建表,然后 PostgreSQL 脚本/查询执行左连接并创建最终表以用于报告目的。我过去听说 Hive 加入不是一个好主意。但是,我注意到 Hive 确实允许连接,所以我不确定为什么这是一个坏主意。

我想使用 Talend 或 Mulesoft 之类的工具在 hive 中创建连接和聚合,并创建一个临时表并将该临时表作为最终表传输到 PostgreSQL 以进行报告。

任何建议,尤其是如果这不是 HIVE 的良好做法。我是新来的蜂巢。

谢谢。

【问题讨论】:

  • 在 Hive 中进行连接是完全合理的。谁告诉你他们不是一个好主意?可以参考一下吗?
  • 一群初级数据分析师不断抱怨左连接是个坏主意,而且效率不高。我认为如果在 Hive 中完成而不是将所有内容都转移到 PostgreSQL 进行 ETL 会更有效
  • 当我进行连接时,我根本没有发现 ETL 有任何问题。
  • 一般来说,Hive 中的左连接的效率不亚于任何 RDBMS。请注意,由于 MR 的限制,Hive 中的外连接只能是等连接,
  • 对等连接我应该注意什么?进行自我 equi-join 会有问题吗?

标签: sql hive etl hiveql talend


【解决方案1】:

加入 hive 的主要问题与数据局部性有关。

Hive 查询作为 MapReduce 作业执行,并且将在数据所在的节点中尽可能多地启动多个映射器。

但是,在连接表时,来自 LHS 和 RHS 表的两行数据通常不会在同一个节点中,这可能会导致节点之间产生大量网络流量。

在 Hive 中加入本身还不错,但如果要加入的两个表很大,可能会导致作业缓慢。

如果其中一个表明显小于另一个,您可能希望将其存储在 HDFS 缓存中,使其数据在每个节点中都可用,从而允许连接算法在本地检索所有数据。

因此,在 Hive 中运行大型联接并没有错,您只需要注意它们需要时间来完成。

【讨论】:

  • HDFS 缓存是否可以通过 HiveQL 完成?我尝试创建临时配置单元表,但查询速度很慢。
【解决方案2】:

在 HIVE 中进行联接非常好,我是一名 ETL 测试人员,并且大多数时候在 Hive 中的大表上执行左联接,查询运行顺利,但有时作业确实卡住或由于网络流量而变慢.

还取决于集群拥有的节点数。

谢谢

【讨论】:

  • 如果有时卡住了,那就是个坏主意。即使对您来说也可能是个坏主意,因为随着您的数据仓库的增长,现在有效的查询可能会随着网络流量的增加而随着时间的推移而遭受性能下降。
【解决方案3】:

Hive 越来越成熟

反对使用连接的论点可能不再适用于最新版本的 hive。

我在manual section on join optimization找到的最清楚的例子:

Hive 0.11 之前的 MAPJOIN 实现具有以下限制:

mapjoin 运算符一次只能处理一个键

因此,我建议询问他们不情愿的基础是什么,然后仔细检查它是否仍然适用。他们的论点很可能仍然有效,或者可能已经解决。


旁注: 就我个人而言,我发现 Pig 代码比 hive 更易于重用和维护,考虑使用 Pig 而不是 hive 对您的(hive 表)数据执行 map-reduce 操作。

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 2011-10-06
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2015-10-29
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多