apache-spark - Spark 与 Hive 的差异与 ANALYZE TABLE 命令 -
问题描述
从 Spark 对 Hive 表运行的 ANALYZE TABLE 命令不会提供与从 Hive 发出的相同命令相同的性能改进。
例如,我已将一个数据框插入到一个空的 Hive 表中:-
output.write.insertInto(“XXXXXXXX”)
然后运行分析表命令:-
spark.sql("ANALYZE TABLE XXXXXXXX COMPUTE STATISTICS")
当我在 Hive 中进行记录计数时,速度非常慢:-
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 在编写这些数据时完全忽略了标准 Hive 表统计信息。
如果你做一个
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',
只有在 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 正确使用它们)
唯一的解决方法是使用相应的 hive 作业执行计算统计命令来跟进您的 Spark 作业,这真的很难看。:(
推荐阅读
- javascript - AngularJS - 错误:[$compile:tpload] 无法加载模板(Spring Boot)
- laravel - 在控制器索引函数中检索相关字段会出错,但在显示函数中可以
- java - 如何从我的班级获取参考类记录器消息作为字符串
- python - Django:HTML中的自动编号
- reactjs - 反应站点地图.xml
- c++ - 在 ARM / Raspberry PI 上的多个内核上运行 Eigen 密集矩阵乘法时性能下降
- ruamel.yaml - 使用 ruamel yaml 保留 YAML 的结构
- python - 带有 macOS Big Sur 11.2.1 的苹果 m1 安装软件失败,出现终止错误
- google-apps-script - 谷歌驱动评论,下一个 PageToken 和登录到谷歌表
- amazon-web-services - AWS Amplify 中的应用程序设置下不存在监控选项