Bob*_*Bob 4 apache-spark apache-spark-sql pyspark
从 Spark 在 Hive 表上运行的 ANALYZE TABLE 命令不会提供与从 Hive 发出的相同命令相同的性能改进。
\n\n例如,我已将数据帧插入到空的 Hive 表中:-
\n\noutput.write.insertInto(\xe2\x80\x9cXXXXXXXX\xe2\x80\x9d)\nRun Code Online (Sandbox Code Playgroud)\n\n然后运行分析表命令:-
\n\nspark.sql("ANALYZE TABLE XXXXXXXX COMPUTE STATISTICS")\nRun Code Online (Sandbox Code Playgroud)\n\n当我在 Hive 中进行记录计数时,速度非常慢:-
\n\nselect count(*) from XXXXXXXX;\n+-----------+\n| _c0 |\n+-----------+\n| 12345678 |\n+-----------+\n1 row selected (36.038 seconds)\nRun Code Online (Sandbox Code Playgroud)\n\n但是,如果我直接在 Hive 中运行相同的分析表命令,性能会提高:-
\n\nselect count(*) from XXXXXXXX;\n+-----------+\n| _c0 |\n+-----------+\n| 12345678 |\n+-----------+\n1 row selected (0.096 seconds)\nRun Code Online (Sandbox Code Playgroud)\n\n谁能解释为什么会出现这种差异?\n有解决方法吗?
\nCle*_*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 作业,这确实很难看。:(
| 归档时间: |
|
| 查看次数: |
5005 次 |
| 最近记录: |