我使用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的统计信息,则可以使用它们。
有人可以确认吗?
在此先感谢您帮助我解决此问题。