从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)
有人能解释为什么会出现这种差异吗?有变通办法吗?
如果你做
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作业之后,用一个相应的配置单元作业来执行计算统计命令,这真的很难看。:(