收集Apache Spark中的Hive列统计信息

时间:2018-10-23 20:04:04

标签: apache-spark hive table-statistics

我使用Pyspark 2.1从配置单元表中计算表和列统计信息。

当我这样做时:

spark.sql("ANALYZE TABLE <table name> COMPUTES STATISTICS")

我可以使用DESCRIBE EXTENDED SQL命令收集统计信息:

spark.sql("DESCRIBE EXTENDED <table name>").show()

但是,当像这样计算列统计信息时:

spark.sql("ANALYZE TABLE <table name> COMPUTES STATISTICS FOR COLUMNS")

该作业已发送并成功完成,但是我无法按照this answer的建议使用SQL命令收集统计信息:

spark.sql("DESCRIBE EXTENDED <table name> <column name>").show()

我明白了:

  

ParseException不支持的SQL语句

重新发出相同的DESCRIBE EXTENDED查询(无列名)不会 返回CatalogTable中的所有更改:我只能看到表统计信息(即sizeInBytes和rowCount)。

这另外一个answer建议从元存储中的“表”中检索Spark统计信息,但这对我来说是个秘密...

如何在Spark中访问这些列级统计信息?


编辑:我对此进行了进一步调查,这使我可以完善问题的范围:

似乎我的Hive客户端(Hive View 2.0)和Spark SQL不在同一位置写入统计信息。

  • 使用Spark SQL的ANALYZE TABLE方法时,仅表统计信息显示在CatalogTable的 Statistics 键中:

     Statistics: sizeInBytes=15196959528, rowCount=39763901, isBroadcastable=false
    

但是,Hive View对这些统计信息视而不见,这些统计信息未在我的表格统计信息中列出

  • 相反,当在Hive View中计算表或列统计信息时,我可以使用Spark SQL的DESCRIBE EXTENDED方法收集表统计信息,但是它们显示在CatalogTable的 Properties 键中。它还指示是否已计算某些列统计信息:

    Properties: [numFiles=20, transient_lastDdlTime=1540381765, totalSize=15196959528, COLUMN_STATS_ACCURATE={"COLUMN_STATS":{"bubble_level":"true","bubble_level_n1s":"true","timestamp":"true"}}]
    

因此,这些信息似乎是独立的,然后我的问题变成了:Spark可以使用哪些信息来优化执行计划?我知道可以通过升级到最新版本的Spark来解决其中的一些问题,但这暂时不在我的时间表内。

Jacek Laskowski的上述answer建议,如果可以通过Spark SQL DESCRIBE EXTENDED方法获得Hive的统计信息,则可以使用它们。

有人可以确认吗?

在此先感谢您帮助我解决此问题。

0 个答案:

没有答案