Spark 与 Hive 与 ANALYZE TABLE 命令的差异 -

Bob*_*Bob 4 apache-spark apache-spark-sql pyspark

从 Spark 在 Hive 表上运行的 ANALYZE TABLE 命令不会提供与从 Hive 发出的相同命令相同的性能改进。

\n\n

例如,我已将数据帧插入到空的 Hive 表中:-

\n\n
output.write.insertInto(\xe2\x80\x9cXXXXXXXX\xe2\x80\x9d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后运行分析表命令:-

\n\n
spark.sql("ANALYZE TABLE XXXXXXXX COMPUTE STATISTICS")\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我在 Hive 中进行记录计数时,速度非常慢:-

\n\n
select count(*) from XXXXXXXX;\n+-----------+\n|    _c0    |\n+-----------+\n| 12345678  |\n+-----------+\n1 row selected (36.038 seconds)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,如果我直接在 Hive 中运行相同的分析表命令,性能会提高:-

\n\n
select count(*) from XXXXXXXX;\n+-----------+\n|    _c0    |\n+-----------+\n| 12345678  |\n+-----------+\n1 row selected (0.096 seconds)\n
Run Code Online (Sandbox Code Playgroud)\n\n

谁能解释为什么会出现这种差异?\n有解决方法吗?

\n

Cle*_*nte 11

这是因为火花很愚蠢。Spark 的 ANALYZE TABLE 命令仅将计算出的统计信息以 Spark 兼容的格式写入 Hive 不知道的表属性中。Spark 在编写这些数据时完全忽略标准 Hive 表统计信息。

如果你做一个

show create table XXXXXXXX
Run Code Online (Sandbox Code Playgroud)

在 Hive 中执行 Spark.sql("ANALYZE..") 步骤后,您将在 tbl_properties 部分看到以下内容:

TBLPROPERTIES ( 
  'numFiles'='1', 
  'numRows'='-1', 
  'rawDataSize'='-1', 
  'spark.sql.statistics.numRows'='12345678', 
  'spark.sql.statistics.totalSize'='12345678', 
  'totalSize'='12345678', 
Run Code Online (Sandbox Code Playgroud)

只有在 hive 中执行相同的命令后,您才会得到正确的信息:

TBLPROPERTIES ( 
  'numFiles'='1', 
  'numRows'='12345678', 
  'rawDataSize'='12345678', 
  'spark.sql.statistics.numRows'='12345678', 
  'spark.sql.statistics.totalSize'='12345678', 
  'totalSize'='12345678', 
Run Code Online (Sandbox Code Playgroud)

Spark在计算统计数据时能否正确填写numRows和rawDataSize字段?大概。为什么它不这样做呢?不知道。:( Spark 开发人员可能正在为 Hive 这样的低级系统进行优化。(尽管 Apache Impala 等其他框架也将从这里的正确统计数据中受益 - 因为 Impala 正确使用它们)

唯一的解决方法是使用相应的 hive 作业执行计算统计命令来跟踪您的 Spark 作业,这确实很难看。:(

  • Spark 3 解决了这个问题吗? (3认同)