【问题标题】:Hive table count is showing 0 via java JDBC driverHive 表计数通过 java JDBC 驱动程序显示为 0
【发布时间】:2020-06-11 10:59:12
【问题描述】:

当我通过 java 从 JDBC 访问 hive 表时,我得到 0 条记录。但是来自直线的相同查询工作正常并显示一些数字。可能是什么原因。?

【问题讨论】:

  • 你能补充更多细节吗?例如 1. 如果您尝试执行 SELECT 操作 - 您是否在 JDBC Client 和 Beeline 上看到数据? 2. 您是否看到在 Beeline 和 JDBC 客户端中作为计数执行的一部分触发了 MapReduce 作业?
  • 很少有表显示来自 jdbc 的 0,同一架构中的其他表显示一些与直线计数 (*) 命令匹配的数字。
  • @Gomz.. 我如何使用 JDBC 客户端检查 MR 作业是否正在运行..
  • 您可以在 HiveServer2 日志中检查相应的 queryId。

标签: java apache-spark hive


【解决方案1】:

您看到的行为可能是由于 HiveMetastore 中某些表的过时统计数据以及查询引用了这些数据。

要对此进行测试,您可以通过在 Beeline-Hive 和 JDBC 客户端会话上运行 set hive.compute.query.using.stats; 来检查为该属性设置的值是 TRUE 还是 FALSE。

如果为 TRUE,查询将从 HiveMetastore 获取统计信息。 (这通常更快,因为它从 HiveMetastore 获取计数,而不是通过执行 MapReduce 作业。但如果未在 HiveMetastore 中更新表的统计信息,它可能会返回不正确/陈旧的计数)

如果为 FALSE,查询将运行 MapReduce 作为执行的一部分,并根据 HDFS 中数据文件中存在的记录执行计数。与上一个相比,这很耗时,但会返回准确的结果。

解决方案:

  1. 您可以通过在 Beeline-Hive 和 JDBC 客户端会话中运行以下语句将属性 hive.compute.query.using.stats 设置为 false。这样,Hive 将通过 MapReduce 作业根据 HDFS 中存在的数据执行计数。
set hive.compute.query.using.stats=false;

  1. 通过在 Beeline-Hive 或 JDBC 客户端会话中运行以下语句手动计算表的统计信息。这将使用更新的统计信息更新 HiveMetastore。在此之后,count(*) 应该在该表的任何 Hive 会话中返回正确的结果。
ANALYZE TABLE <database_name>.<table_name> COMPUTE STATISTICS;

希望这会有所帮助!

【讨论】:

  • 感谢您的意见。尝试了 #1 选项来设置环境。 jdbc 参数中的变量如下所示:jdbc:hive2://xxxx:7183/;principal=hive/dev.cliennet.com@cliennet.COM?hive.compute.query.using.stats=false.. - 获取计数值为0 .. 在执行 count 查询之前也尝试了 #2 选项,执行了分析命令。低于异常“org.apache.hive.service.cli.HiveSQLException:编译语句时出错:失败:RuntimeException 无法创建暂存目录”
  • 检查完整的错误并根据您为缓解问题所做的努力更新问题。
猜你喜欢
  • 2020-05-22
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
相关资源
最近更新 更多