Hive 查询在 Hive 客户端和 JDBC 中的执行方式不同

Hive query executing differently in Hive client and JDBC

我通过 Hive 客户端、Java 程序 JDBC 和直线执行的以下查询。

SELECT
*
FROM
    TABLE_ONE AS t1
    JOIN TABLE_TWO t2 ON t2.p_id = t1.p_id 
        AND t2.p_n_id = t1.p_n_id 
        AND t2.d_id = t1.d_id
    JOIN TABLE_THREE t3 ON t3.d_m_id = t1.d_m_id
        AND t3.d_p_id = t1.d_p_id
    JOIN TABLE_FOUR t4 ON t4.c_id = t1.c_id
    JOIN TABLE_FIVE t5 ON t5.a_n_id = t1.a_n_id
    JOIN TABLE_SIX t6 ON t6.d_p_p_s_id = t1.d_p_p_s_id
        AND t6.a_v_id = t1.a_v_id
        AND t6.p_f_id = t1.p_f_id

通过 Hive cilent 执行时,它已在 21 秒内完成,而 Java 程序 JDBC 和直线分别花费了大约 110 秒和 200 秒。

这是我在 JDBC

中获得 Hive Connection 的方式
DriverManager.getConnection("jdbc:hive2://<ip address of hive gateway server>:10000/default?zeroDateTimeBehavior=round").

这是每个 table 的行数。

我想要 JDBC 中的 Hive 客户端性能。有什么建议吗?

Hive 版本为 0.13.1 (Cloudera 5.3.3)

一些可以帮助您调试的建议:

当 运行 来自直线客户端并通过 JDBC 时设置的属性。

我怀疑 属性 hive.auto.convert.join 导致了这种行为。

基本上从直线开始,它能够读取每个映射器内存中的所有较小的表(2 到 6 个),并将其用于连接。但在第二种情况下,它执行一个 Mapper 来读取每个输入。

尝试将 hive.auto.convert.join 设置为 true。您可能还需要玩弄:hive.auto.convert.join.noconditionaltask & hive.auto.convert.join.noconditionaltask.size.

HTH.