1

我用来Pyspark 2.1从 hive 表中计算表和列统计信息。

当我做:

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

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

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

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

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

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

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

我得到:

ParseException 不支持的 SQL 语句

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

This other answer建议从元存储中的“表”中检索Spark统计信息,但这对我来说很神秘......

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


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

看起来我的 Hive 客户端(Hive View 2.0)和 Spark SQL 没有将统计信息写入同一位置。

  • 使用 Spark SQL 的ANALYZE TABLE方法时,-only- 表统计信息显示在 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的上述回答DESCRIBE EXTENDED表明,如果可以通过 Spark SQL方法获得 Hive 的统计信息,则可以使用它们。

有人可以证实这一点吗?

非常感谢您帮助我解决这个问题。

4

0 回答 0