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

Spark vs Hive differences with ANALYZE TABLE command -

来自 Spark on a Hive table 的 ANALYZE TABLE 命令 运行 没有提供与从 Hive 发出的相同命令相同的性能改进。

例如,我将一个数据帧插入到一个空的 Hive 中 table:-

output.write.insertInto(“XXXXXXXX”)

然后 运行 分析 table 命令:-

spark.sql("ANALYZE TABLE XXXXXXXX COMPUTE STATISTICS")

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

select count(*) from XXXXXXXX;
+-----------+
|    _c0    |
+-----------+
| 12345678  |
+-----------+
1 row selected (36.038 seconds)

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

select count(*) from XXXXXXXX;
+-----------+
|    _c0    |
+-----------+
| 12345678  |
+-----------+
1 row selected (0.096 seconds)

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

是因为spark笨。 Spark 的 ANALYZE TABLE 命令仅将计算的统计数据以 Spark 兼容的格式写入 Hive 不知道的 table 属性。 Spark 在写入这些数据时完全忽略了标准 Hive table 统计数据。

如果你做

show create table XXXXXXXX

在 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', 

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

TBLPROPERTIES ( 
  'numFiles'='1', 
  'numRows'='12345678', 
  'rawDataSize'='12345678', 
  'spark.sql.statistics.numRows'='12345678', 
  'spark.sql.statistics.totalSize'='12345678', 
  'totalSize'='12345678', 

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

唯一的解决方法是用相应的配置单元作业执行计算统计命令来跟进您的 Spark 作业,这真的很难看。 :(