【发布时间】:2020-07-07 14:27:20
【问题描述】:
我在公司糟糕的数据环境中使用 Spark 2.4.0 和 scala 2.11.12。在我的项目中,我创建了许多包含大量数据的表。 现在,我想计算我创建的表的统计信息。
我发现以下 scala/spark sql 语句应该这样做:
// example 1
val res = spark.sql("ANALYZE TABLE mytablename COMPUTE STATISTICS FOR COLUMNS col_name1, col_name2")
// example 2
val res = spark.sql("ANALYZE TABLE mytablename COMPUTE STATISTICS FOR COLUMNS col_name1, col_name2").queryExecution.logical
import org.apache.spark.sql.execution.command.AnalyzeColumnCommand
// example 3
val res = spark.sql("ANALYZE TABLE mytablename COMPUTE STATISTICS FOR ALL COLUMNS")
// example 4
val res = spark.sql("ANALYZE TABLE mytablename COMPUTE STATISTICS FOR COLUMNS col_not_exists")
在所有情况下,我都会先使元数据无效,然后再开始检查结果。
在示例 // 1 的情况下,我没有收到任何错误消息,但我也没有在 table stats 中看到任何结果(“show table stats mytablename”)。似乎没有对这些列进行任何计算。 在示例 // 2 的情况下,我得到与 //1 相同的结果。 例如 // 3 我收到错误信息:
org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input 'ALL' expecting <EOF>(line 1, pos 70)
== SQL ==
ANALYZE TABLE mytablename COMPUTE STATISTICS FOR ALL COLUMNS
-------------------------------------------------^^^
在最后一个例子中 // 4 我尝试计算表中不存在的列的表统计信息。在这里,我没有收到任何预期的错误消息。
使用 scala 2.11 和 Spark 2.4 对所有列或至少对其中一些列简单地计算表统计信息的最佳做法是什么?
【问题讨论】: