配置单元表计数通过java JDBC驱动程序显示为0

配置单元表计数通过java JDBC驱动程序显示为0,java,apache-spark,hive,Java,Apache Spark,Hive,当我通过java从JDBC访问配置单元表时,我得到了0条记录。但是来自beeline的同一个查询运行良好,并显示了一些数字。原因可能是什么 您看到的行为可能是由于HiveMetastore中某些表的过时统计数据造成的,如果查询引用了这些数据 要测试这一点,可以通过运行set hive.compute.query.using.stats进行检查;在直线配置单元和JDBC客户端会话上,查看属性的值集是TRUE还是FALSE 如果为TRUE,查询将从HiveMetastore获取统计信息。这通常更快,

当我通过java从JDBC访问配置单元表时,我得到了0条记录。但是来自beeline的同一个查询运行良好,并显示了一些数字。原因可能是什么

您看到的行为可能是由于HiveMetastore中某些表的过时统计数据造成的,如果查询引用了这些数据

要测试这一点,可以通过运行set hive.compute.query.using.stats进行检查;在直线配置单元和JDBC客户端会话上,查看属性的值集是TRUE还是FALSE

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

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

解决方案:

通过在直线配置单元和JDBC客户端会话中运行以下语句,可以将属性hive.compute.query.using.stats设置为false。这样,Hive将通过MapReduce作业根据HDFS中存在的数据执行计数。 或

通过在Beeline配置单元或JDBC客户端会话中运行下面的语句,手动计算表的统计信息。这将使用更新的统计信息更新HiveMetastore。在此计数之后*应在该表的任何配置单元会话中返回正确的结果。
希望这有帮助

你能补充更多细节吗?例如1。如果您正在尝试执行SELECT操作,您是否同时在JDBC客户机和Beeline上看到数据?2.您是否看到在Beeline和JDBC客户端中,MapReduce作业作为计数执行的一部分被触发?很少有表显示来自JDBC的0。同一架构中的其他表显示一些与Beeline count*命令匹配的数字。@Gomz。。如何使用JDBC客户端检查MR作业是否正在运行..您可以在HiveServer2日志中检查相应查询ID。感谢您的输入。尝试了1个选项来设置环境。jdbc参数中的变量如下:jdbc:hive2://x.x.x.x:7183/;主体=hive/dev.cliennet。com@cliennet.COM?hive.compute.query.using.stats=false..-正在将计数值获取为0。。在执行计数查询之前,还尝试了2个选项,执行了analyze命令。获取以下异常org.apache.hive.service.cli.HiveSQLException:编译语句时出错:失败:RuntimeException无法创建临时目录检查完整错误,并用您为缓解此问题所做的努力更新问题。
set hive.compute.query.using.stats=false;
ANALYZE TABLE <database_name>.<table_name> COMPUTE STATISTICS;