我用来Pyspark 2.1
从 hive 表中计算表和列统计信息。
当我做:
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")
作业已发送并成功完成,但我无法按照此答案的建议使用 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 的统计信息,则可以使用它们。
有人可以证实这一点吗?
非常感谢您帮助我解决这个问题。