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")
ジョブは送信され、正常に完了しましたが、この回答でアドバイスされているように、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
メソッドを使用すると、テーブル統計のみが CatalogTable のStatisticsキーに表示されます。Statistics: sizeInBytes=15196959528, rowCount=39763901, isBroadcastable=false
ただし、Hive View はこれらの統計を認識できず、テーブルの統計には表示されません。
逆に、Hive ビュー内でテーブルまたは列の統計を計算する場合、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
は、Hive の統計が Spark SQLメソッドを介して利用できる場合に使用できることを示唆しています。
誰でもこれを確認できますか?
これを解決するのを手伝ってくれてありがとう。