在hive或impala中计算表stats如何加速sparksql中的查询?

332nm8kg  于 2021-06-28  发布在  Hive
关注(0)|答案(3)|浏览(380)

为了提高性能(例如对于联接),建议首先计算表静态。
在 hive 里我能做到:

analyze table <table name> compute statistics;

在 Impala :

compute stats <table name>;

我的spark应用程序(从配置单元表读取)是否也受益于预先计算的统计数据?如果是,我需要运行哪一个?他们都在Hive元存储中保存数据吗?我在cloudera 5.5.4上使用spark 1.6.1
注:spark 1.6.1文件中(https://spark.apache.org/docs/1.6.1/sql-programming-guide.html)对于参数 spark.sql.autoBroadcastJoinThreshold 我发现了一个提示:
请注意,当前统计信息仅支持已运行命令analyze table compute statistics noscan的配置单元元存储表。

r6hnlfcb

r6hnlfcb1#

我假设您使用的是spark上的配置单元(或)spark sql和配置单元上下文。如果是这样,您应该在配置单元中运行analyze。
analyze table<…>通常需要在创建表之后运行,或者如果有重要的插入/更改。如果这是mr或spark作业,您可以在加载步骤结束时自己执行此操作。
在分析时,如果您使用的是spark上的配置单元-请同时使用下面链接中的配置。您可以在会话级别为每个查询设置此选项。我使用了这个链接中的参数https://cwiki.apache.org/confluence/display/hive/hive+on+spark%3a+getting+started 在生产和它的工作良好。

vsnjm48y

vsnjm48y2#

据我所知,impala上的computestats是最新的实现,它使您不必调整配置单元设置。
来自官方文件:
如果使用基于配置单元的方法来收集统计信息,请参阅配置单元wiki以获取有关配置单元端所需配置的信息。cloudera建议使用impala compute stats语句来避免统计数据收集过程中潜在的配置和可伸缩性问题。
如果运行配置单元语句analyze table compute statistics for columns,impala只能在表未分区的情况下使用生成的列统计信息。impala不能对分区表使用配置单元生成的列统计信息。
有用链接:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_perf_stats.html

rseugnpd

rseugnpd3#

这是即将发布的spark2.3.0(可能有些特性已经在2.2.1或更早版本中发布)。
我的spark应用程序(从配置单元表读取)是否也受益于预先计算的统计数据?
如果impala或hive在spark可以读取的表元数据的hive metastore中记录了表统计信息(例如表大小或行计数)(并将其转换为自己的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      |
+--------------+----------+
``` `ANALYZE TABLE COMPUTE STATISTICS noscan` 计算spark使用的一个统计信息,即表的总大小(由于 `noscan` 选项)。如果 Impala 和Hive把它记录到了一个“适当”的位置,sparksql就会把它显示出来 `DESC EXTENDED` .
使用 `DESC EXTENDED tableName` 查看是否找到了由 Impala 或Hive生成的数据。如果他们在 `DESC EXTENDED` 的输出,它们将用于优化联接(并且在聚合和筛选器启用基于成本的优化的情况下)。
列统计信息(以特定于spark的序列化格式)存储在表属性中,我真的怀疑impala或hive是否能够计算统计信息并以spark-sql兼容的格式存储它们。

相关问题