Rap*_*oth 9 hive impala apache-spark apache-spark-sql
为了提高性能(例如,对于连接),建议首先计算表静态.
在Hive我可以做::
analyze table <table name> compute statistics;
Run Code Online (Sandbox Code Playgroud)
在Impala中:
compute stats <table name>;
Run Code Online (Sandbox Code Playgroud)
我的spark应用程序(从hive-tables读取)是否也受益于预先计算的统计数据?如果是,我需要运行哪一个?它们是否都保存了hive Metastore中的统计数据?我在Cloudera 5.5.4上使用spark 1.6.1
注意:在参考文献的火花1.6.1(https://spark.apache.org/docs/1.6.1/sql-programming-guide.html)中,spark.sql.autoBroadcastJoinThreshold
我找到了一个提示:
请注意,目前只有运行命令ANALYZE TABLE COMPUTE STATISTICS noscan的Hive Metastore表支持统计信息.
这是即将发布的Spark 2.3.0(也许某些功能已在2.2.1或更早的版本中发布)。
我的spark应用程序(从配置单元表中读取)是否也受益于预先计算的统计信息?
如果Impala或Hive将表统计信息(例如表大小或行数)记录在Spark可以从中读取的表元数据的Hive元存储中(并转换为自己的Spark统计信息以进行查询计划)。
您可以使用中的DESCRIBE EXTENDED
SQL命令轻松地将其检出spark-shell
。
scala> spark.version
res0: String = 2.4.0-SNAPSHOT
scala> sql("DESC EXTENDED t1 id").show
+--------------+----------+
|info_name |info_value|
+--------------+----------+
|col_name |id |
|data_type |int |
|comment |NULL |
|min |0 |
|max |1 |
|num_nulls |0 |
|distinct_count|2 |
|avg_col_len |4 |
|max_col_len |4 |
|histogram |NULL |
+--------------+----------+
Run Code Online (Sandbox Code Playgroud)
ANALYZE TABLE COMPUTE STATISTICS noscan
计算Spark使用的一个统计信息,即表的总大小(由于noscan
选项而没有行计数指标)。如果Impala和Hive将其记录到“适当的”位置,Spark SQL将在中显示它DESC EXTENDED
。
使用DESC EXTENDED tableName
表级统计,看看您是否找到黑斑羚或蜂房中生成的那些。如果它们在DESC EXTENDED
的输出中,则将用于优化联接(并且针对聚合和过滤器也启用了基于成本的优化)。
列统计信息(以Spark特定的序列化格式)存储在表属性中,我真的怀疑Impala或Hive是否可以计算统计并将其存储为Spark SQL兼容格式。
据我了解,impala 上的计算统计信息是最新的实现,使您无需调整配置单元设置。
来自官方文档:
如果您使用基于 Hive 的方法收集统计信息,请参阅 Hive wiki 以获取有关 Hive 端所需配置的信息。Cloudera 建议使用 Impala COMPUTE STATS 语句来避免统计数据收集过程中潜在的配置和可扩展性问题。
如果您运行 Hive 语句 ANALYZE TABLE COMPUTE STATISTICS FOR COLUMNS,则仅当表未分区时,Impala 才能使用结果列统计信息。Impala 无法对分区表使用 Hive 生成的列统计信息。
有用的链接: https ://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_perf_stats.html
归档时间: |
|
查看次数: |
4546 次 |
最近记录: |