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



从Spark在配置单元表上运行的ANALYZE TABLE命令并没有提供与从配置单元发出的相同命令相同的性能改进。

例如,我在一个空的配置单元表中插入了一个数据帧:-

output.write.insertInto(“XXXXXXXX”)

然后运行分析表命令:-

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

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

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

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

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

有人能解释为什么会出现这种差异吗?有变通办法吗?

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

如果你做

show create table XXXXXXXX

在查询的spark.sql("ANALYZE..")步骤之后的Hive中,您将在tbl_properties部分中看到以下内容:

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

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

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作业之后,用一个相应的配置单元作业来执行计算统计命令,这真的很难看。:(

相关内容

  • 没有找到相关文章

最新更新